【问题标题】:Meteor Mongo BulkOp turning ObjectID into plain objectMeteor Mongo BulkOp 将 ObjectID 转换为普通对象
【发布时间】: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()。但是 bson ObjectId 不是 Mongo 原生支持的类型吗?使用批量操作时,实际上没有办法处理 ObjectId 吗?
  • 在本地方法上,您实际上需要获取本地实现。您应该能够通过MongoInternals 从加载的驱动程序访问,或者从bson 包(适用于所有语言)独立加载。 Mongo.Collection.ObjectID不是简单的ObjectId 表示,实际上是 Meteor 内部使用的复杂对象。因此,为什么原生方法不知道如何使用该值。
  • 哦,好的,太棒了。所以像MongoInternals.NpmModule.ObjectID。有道理,在使用aggregation API 时我必须做同样的事情。

标签: node.js mongodb meteor bulkinsert


【解决方案1】:

来自Neil's top-level comment

在本机方法上,您实际上需要获取本机实现。您应该能够通过 MongoInternals [...]

从加载的驱动程序中访问

Mongo.Collection.ObjectID 不是普通的 ObjectId 表示,实际上是 Meteor 内部使用的复杂对象。因此,为什么原生方法不知道如何使用该值。

因此,如果您有一些字段是 ObjectId,并且您正在使用 Meteor Collection 的 rawCollection 的某种方法(例如,

  • .distinct
  • .aggregate
  • .initializeOrderedBulkOp
  • .initializeUnorderedBulkOp

),你会想要转换你的 ObjectId 使用

const convertedID = new MongoInternals.NpmModule.ObjectID(
  originalID._str
);
// then use in one of the arguments to your function or something
const query = {_id: convertedID};

在对它们调用方法之前。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 2016-08-07
    • 2014-03-24
    • 2016-08-30
    • 1970-01-01
    相关资源
    最近更新 更多