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

Posted

技术标签:

【中文标题】Node.js Mongoose.js 字符串到 ObjectId 函数【英文标题】:Node.js Mongoose.js string to ObjectId function 【发布时间】:2011-09-28 12:31:56 【问题描述】:

是否有使用猫鼬将字符串转换为节点中的 objectId 的功能?架构指定某物是一个 ObjectId,但是当它从字符串中保存时,mongo 告诉我它仍然只是一个字符串。例如,对象的_id 显示为objectId("blah")

【问题讨论】:

【参考方案1】:

你可以这样做:

var mongoose = require('mongoose');
var _id = mongoose.mongo.BSONPure.ObjectID.fromHexString("4eb6e7e7e9b7f4194e000001");

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

【讨论】:

好吧,更多“新”标准似乎是 mongoose.mongo.BSONPure.ObjectID.createFromHexString()(从 mongoose 3.9.7 开始) 对于那些试图这样做的人来说,这是一个比所选答案更好的答案,因为如果您已经在使用 mongo id,它不会转换 id。 这不再有效,改用接受的答案 BSONPure 对我来说不是mongoose.mongo 的一部分。有人可以确认吗?【参考方案2】:

你可以这样做:

var mongoose = require('mongoose');
var id = mongoose.Types.ObjectId('4edd40c86762e0fb12000003');

【讨论】:

是的,在这种情况下更简洁一些。如果执行 fromTime(),可能只需要使用 mongo.BSONPure 如果它是无效的字符串,这会引发错误吗?寻找在 REST API 中对 mongo id 字段进行输入验证的最佳方式。 并没有真正回答这个问题,因为使用这种方法,字符串将被转换并且与原始字符串不同。 @KevinDente 我正在使用带有 Typescript 的 Nodejs,我已经尝试了您的解决方案,但仍然得到一个字符串,并且我的查询没有返回它应该返回的内容。关于如何在打字稿上做的任何想法? 似乎适用于常见的 js 需求,但使用 es6 import mongoose from 'mongoose'; 似乎不起作用。 Argument of type 'import("mongoose").Types.ObjectId' is not assignable to parameter of type 'import("mongoose").Schema.Types.ObjectId'.。还有其他人得到这个吗?【参考方案3】:

从 cmets 来看,您正在寻找:

mongoose.mongo.BSONPure.ObjectID.isValid

或者

mongoose.Types.ObjectId.isValid

【讨论】:

【参考方案4】:
var mongoose = require('mongoose');
var _id = mongoose.mongo.ObjectId("4eb6e7e7e9b7f4194e000001");

【讨论】:

您能评论一下mongoose.Types.ObjectIdmongoose.mongo.ObjectId 之间的区别吗? mongoose 的对象属性不同,但它们可能在下面引用相同的方法。请评论Types vs mongo 的底层方法。【参考方案5】:

我无法解决这个方法(诚然我没有搜索太久)

mongoose.mongo.BSONPure.ObjectID.fromHexString

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

不过,你也可以使用这样的东西,这样可以提供更多的灵活性:

function toObjectId(ids) 

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

    return mongoose.Types.ObjectId(ids);

【讨论】:

【参考方案6】:

如果您通过 express 和 mongoose 实现 REST API,只需查看以下代码 sn-p。 (添加示例)

....
exports.AddSomething = (req,res,next) =>
  const newSomething = new SomeEntity(
 _id:new mongoose.Types.ObjectId(), //its very own ID
  somethingName:req.body.somethingName,
  theForeignKey: mongoose.Types.ObjectId(req.body.theForeignKey)// if you want to pass an object ID
)

...

希望对你有帮助

【讨论】:

【参考方案7】:

你也可以用这个

const  ObjectId  = require('mongodb');
const _id = ObjectId("4eb6e7e7e9b7f4194e000001");

这是最简单的方法

【讨论】:

【参考方案8】:

如果你想使用架构

const yourSchemma = new Schema(
"customerId": 
    type: mongoose.Types.ObjectId,
    required: true

);

【讨论】:

以上是关于Node.js Mongoose.js 字符串到 ObjectId 函数的主要内容,如果未能解决你的问题,请参考以下文章

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

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

Node.js:如何在 mongoose.js 中执行 count 命令?

mongoose.js CastError:在路径“未定义”处为值“[object Object]”转换为数字失败

mongoosejs find() ????????

像使用 mongoose-paginate 的过滤器