从十六进制字符串转换为 ObjectID 的二进制表示
如果要将_id
值的 24 字节十六进制字符串表示形式转换为存储在 MongoDB 中的二进制ObjectID,可以使用ObjectID.createFromHexString:
// Need to require ObjectID class if not already included
ObjectID = require('mongodb').ObjectID;
var uid = ObjectID.createFromHexString("5205c4bd7c21105d0d99648c")
比较 ObjectID
您应该使用$gt
运算符进行 ObjectID 比较,而不是$where
. 运算符评估 JavaScript 字符串,$where
不能利用索引;它的性能会低得多(特别是对于这个用例)。
因此findOne()
,查找_id
大于给定 ObjectID 的示例应改为:
db.users.findOne(
{ _id: { $gt: ObjectID("5205c4bd7c21105d0d99648c") } }
)._id
对于查找下一个更高 ObjectID 的可预测结果,您应该使用find()
withsort
和指定明确的排序顺序limit
:
// Find next _id greater than ObjectID("5205c4bd7c21105d0d99648c")
db.users.find(
{_id: { $gt: ObjectID("5205c4bd7c21105d0d99648c") } }
).sort({_id:1}).limit(1).toArray()[0]._id
您会注意到这些 find 示例没有显式调用createFromHexString
. 默认构造函数将尝试根据给定值是 24 字节十六进制字符串、12 字节二进制字符串还是数字ObjectID()
来创建适当的值。ObjectID
如果你知道你提供了什么样的值,最好调用预期的构造函数来限制意外的转换(例如,如果你不小心提供了一个数字而不是一个十六进制字符串)。
数据库引用 (DBRefs)
MongoDB 明确不支持连接,但是当您想要将相关文档的引用存储为另一个文档中的引用时,有一个存储数据库引用 (DBRefs)的约定。_id
Mongoose 有一个ref
选项可以简化引用的工作;请参阅Mongoose 文档中的“人口”。