【问题标题】:If i have a mongo document id as a string how do I query for it as an _id?如果我有一个 mongo 文档 id 作为字符串,我如何将它作为 _id 查询?
【发布时间】:2020-05-09 21:15:46
【问题描述】:

如果我有一个 mongo 文档 ID 作为字符串,我如何将它作为 _id 查询?

.find({_id:'stringID'}) 是否可以正常工作,还是我需要先将其转换为 bson 对象?

【问题讨论】:

  • 您的_id 可以是任何东西(数组除外)。所以是的,字符串 _ids 很好。

标签: javascript node.js mongodb


【解决方案1】:

你的意思是你有一个 ObjectId 的 24 位十六进制数字字符串吗?

假设这就是您的意思,大多数驱动程序都有办法获取字符串并将其转换为 ObjectId。在 JavaScript 中是:

.find({_id:new ObjectId("4f91bfcfaa7c5687a0c686d4")})

更新对节点原生驱动程序更有用(来自https://github.com/christkv/node-mongodb-native的文档):

// Get the objectID type
var ObjectID = require('mongodb').ObjectID;

var idString = '4e4e1638c85e808431000003';
collection.findOne({_id: new ObjectID(idString)}, console.log)  // ok
collection.findOne({_id: idString}, console.log)  // wrong! callback gets undefined

【讨论】:

  • 是的,你明白我的问题。抱歉,可能措辞不好,_ids 是默认的 mongo bson 对象。它们在向客户端发送 json 时会发生突变,因此首先将它们转换为字符串。当它们返回服务器时,我需要将它们转回对象以使用它们查询数据库?
  • 是的,要查询,您需要再次将它们转换为ObjectIds。
  • 顺便说一句,看起来 mongoose 的一些函数会自动转换为 ObjectId,就像你做 findById 一样。看到你提到猫鼬的其他问题之一。
  • 是的,我其实一点也不喜欢猫鼬。我只是使用标准的节点原生库。
  • @EveFreeman 我有一部分 objectid 字符串,想在 mongo shell 中查询它,我该怎么做
【解决方案2】:

如果您的 _id 值是字符串,您可以像查询任何其他字段一样查询它们。 (请记住,如果您为 _id 设置自定义值,它们必须保持唯一,否则您将收到重复键错误。)

这是 Mongo JS Shell 中的一个示例:

> db.test.insert({_id:"stringID1"})
> db.test.insert({_id:"stringID2"})
> db.test.insert({_id:"stringID3"})
> db.test.find({_id:"stringID1"})
{ "_id" : "stringID1" }
> 

这就是你要找的吗?希望我没有误解你的问题!

【讨论】:

  • 这实际上回答了的问题,但显然不是她打算问的问题 ^^
【解决方案3】:

当您使用findByID 时,Mongoose 会自动将字符串_id 转换为ObjectId,因此您可以使用字符串_id 进行查询。

还请记住,从 req.bodyreq.params 进入您的 API 的任何输入都将是字符串类型,因此您需要在需要时进行类型转换...,但如前所述,猫鼬会为您执行此操作,因此您可以只需将 _id 保留为它的字符串格式即可。

【讨论】:

  • 现在这是一个非常有用的答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
  • 2016-09-25
  • 2016-01-23
  • 1970-01-01
  • 2019-11-13
相关资源
最近更新 更多