Node.js Mongoose.js字符串到ObjectId函数

JRP*_*ete 147 mongoose mongodb node.js

是否有使用mongoose将字符串转换为节点中的objectId的函数?模式指定某些东西是ObjectId,但是当它从字符串中保存时,mongo告诉我它仍然只是一个字符串.例如,对象的_id显示为objectId("blah").

Kev*_*nte 363

你可以这样做:

var mongoose = require('mongoose');
var id = mongoose.Types.ObjectId('4edd40c86762e0fb12000003');
Run Code Online (Sandbox Code Playgroud)

  • 似乎可以与常见的 js require 一起使用,但使用 es6 `import mongoose from 'mongoose';` 似乎不起作用。`类型为'import("mongoose").Types.ObjectId'的参数不可分配给类型为'import("mongoose").Schema.Types.ObjectId'的参数。`。还有其他人得到这个吗? (6认同)
  • 如果它是一个无效的字符串,这会引发错误吗?寻找在REST API中为mongo id字段进行输入验证的最佳方法. (3认同)
  • 附议@Stretch0。不适用于 es6 和 typescript。 (3认同)
  • @KevinDente 我正在将 Nodejs 与 Typescript 一起使用,我已经尝试了您的解决方案,但仍然得到一个字符串并且我的查询没有返回它应该返回的内容。关于如何在打字稿上做到这一点的任何想法? (2认同)

tal*_*nes 9

你可以这样做:

var mongoose = require('mongoose');
var _id = mongoose.mongo.BSONPure.ObjectID.fromHexString("4eb6e7e7e9b7f4194e000001");
Run Code Online (Sandbox Code Playgroud)

编辑:新标准有fromHexString而不是fromString

  • 好吧,更“新”的标准似乎是 mongoose.mongo.BSONPure.ObjectID.createFromHexString() (从 mongoose 3.9.7 开始) (3认同)
  • 这不再有效,请改用已接受的答案 (2认同)

小智 9

你也可以使用这个

const { ObjectId } = require('mongodb');
const _id = ObjectId("4eb6e7e7e9b7f4194e000001");
Run Code Online (Sandbox Code Playgroud)

这是最简单的方法


Moh*_*Ali 8

对于新版本,将“新”关键字添加到所选答案中是有效的,如下所示

var mongoose = require("mongoose");
var _id = new mongoose.Types.ObjectId("64b0ee2c189286a5abc6b4ba");
Run Code Online (Sandbox Code Playgroud)


A T*_*A T 5

从评论来看,您正在寻找:

mongoose.mongo.BSONPure.ObjectID.isValid
Run Code Online (Sandbox Code Playgroud)

要么

mongoose.Types.ObjectId.isValid
Run Code Online (Sandbox Code Playgroud)


ste*_*red 5

var mongoose = require('mongoose');
var _id = mongoose.mongo.ObjectId("4eb6e7e7e9b7f4194e000001");
Run Code Online (Sandbox Code Playgroud)

  • 这与接受的答案完全相同 (3认同)
  • 您能否评论“ mongoose.Types.ObjectId”和“ mongoose.mongo.ObjectId”之间的区别?猫鼬的对象属性不同,但是它们可能在下面引用相同的方法。请评论Types vs mongo的基础方法。 (2认同)

Bil*_*nor 5

我无法解决此方法(诚然我没有搜索很长时间)

mongoose.mongo.BSONPure.ObjectID.fromHexString
Run Code Online (Sandbox Code Playgroud)

如果您的架构期望属性为 ObjectId 类型,则转换是隐式的,至少在 4.7.8 中似乎是这种情况。

但是,您可以使用类似的东西,这会提供更多的灵活性:

function toObjectId(ids) {

    if (ids.constructor === Array) {
        return ids.map(mongoose.Types.ObjectId);
    }

    return mongoose.Types.ObjectId(ids);
}
Run Code Online (Sandbox Code Playgroud)