【发布时间】:2018-02-20 05:42:57
【问题描述】:
在使用 Meteor 时,我有时会访问底层的 Node Mongo 驱动程序,以便进行批量更新和插入。
const bulk = Coll.rawCollection().initializeOrderedBulkOp();
bulk.insert({key_id: Mongo.Collection.ObjectID()}); // note key_id is an ObjectID
...
bulk.execute();
但是当我在插入后查看数据库时,key_id 字段的值最终是普通的子文档{_str: '...'}。
有什么方法可以在 Node 的 Mongo 库中使用批量操作(无论 Meteor 使用什么)并将 ObjectID 保持为 Mongo 的 ObjectID 类型?
(有很多关于不同 ID 类型的性质的帖子,以及解释 Minimongo 等。我对将 ObjectID 转换为普通对象的批量操作以及解决该问题特别感兴趣。)
【问题讨论】:
-
您正在使用
.rawCollection(),它公开了底层驱动程序方法。所以这是意料之中的。 “批量”是本机方法,而不是包装的流星方法。如果您想要流星 id 值,则需要提供Random.id()值。 -
ids 已经存在于生产环境中(很多文档,现在有一段时间了),输入
ObjectId(比如,使用pymongo来查询它们,我可以使用from bson import ObjectId; ObjectId('7613...');),所以我不幸的是,不能只选择使用Random.id()。但是 bsonObjectId不是 Mongo 原生支持的类型吗?使用批量操作时,实际上没有办法处理 ObjectId 吗? -
在本地方法上,您实际上需要获取本地实现。您应该能够通过
MongoInternals从加载的驱动程序访问,或者从bson包(适用于所有语言)独立加载。Mongo.Collection.ObjectID不是简单的ObjectId表示,实际上是 Meteor 内部使用的复杂对象。因此,为什么原生方法不知道如何使用该值。 -
哦,好的,太棒了。所以像
MongoInternals.NpmModule.ObjectID。有道理,在使用aggregationAPI 时我必须做同样的事情。
标签: node.js mongodb meteor bulkinsert