【问题标题】:MongoDb insert() is putting _id into my objects and I don't want them [duplicate]MongoDb insert() 将 _id 放入我的对象中,我不希望它们 [重复]
【发布时间】:2014-01-06 18:04:28
【问题描述】:

如果我有一个对象数组,比如说

var myArray = [
  { name: 'Fred', state: 'CA' },
  { name: 'Jane', state: 'DE' }
];

并将它们插入到 mongo 集合中(我使用的是 node.js 和“标准”npm mongo 驱动程序,npmjs.org/package/mongodb)

someCollection.insert(myArray, errCallback);

结果对象(在内存中 - 使用调试器查看)现在添加了 _id 字段,这让我有点惊讶。

有没有办法避免这种情况?在某些方面拥有 _id 是一件好事,事实上,我写了一些额外的代码,因为我认为它不会存在!但我想将它们打印为 JSON 等,最终用户可能不想看到类似的东西

"name" : "Fred",
"_id": "52caeb50559518c01ab1dda5"

(加上可能的安全问题)

显然,我可以调整我的打印代码,但在未来最好避免这种情况,或者至少知道如何去做。如果不能避免,我肯定要自己写ID生成器。

查看文档 (http://mongodb.github.io/node-mongodb-native/api-generated/collection.html) 我看到了 forceServerObjectId,但这不是我想要的。

【问题讨论】:

  • 以前在这里回答过:stackoverflow.com/questions/12378320/…
  • @gview 谢谢。唉,在节点的 mongo 驱动程序中创建集合时,他们建议的解决方案 {autoIndexId: false} 未列为选项。
  • 我个人的看法是,您正在尝试很长的路要禁用 mongodb 内在的某些东西,您以后可能会发现您需要。您还可以覆盖内置密钥生成并用您自己选择的密钥替换它,如果这对您有吸引力,但您的帖子表明您已经知道这一点。如果您认为您可能需要分片,您可能还需要考虑您的分片键可能是什么。分片键的问题是一旦设置它们就不能更改,因此即使您有一个多段分片键,任何组件都不能更改。
  • @gview 经过一番考虑,我同意你的看法。简单地添加我自己的密钥生成器将有助于很多事情,这样我就可以“与”Mongo“合作”而不是与之对抗。
  • @gview 除非有人在接下来的一两天内想出一些很棒的东西,如果你把你的评论作为答案,我会“接受”它。

标签: javascript node.js mongodb


【解决方案1】:

我不熟悉 node.js 驱动程序,但我可以证明默认 MongoDB shell 的默认行为。当您执行普通的 db.collection.find( {query}, {fields}) 查询时,_id 字段会自动包含在输出中。要删除 _id 字段,您需要在输出的字段选择中明确声明 _id : 0。 node.js 驱动程序中的行为可能类似。

【讨论】:

  • 我(曾经)在 finds() 上使用了 {_id:0} 选项,它确实适用于 Node 驱动程序。我的问题是,当我执行 insert() 时,_ids 会添加到内存对象中。
猜你喜欢
  • 2021-04-25
  • 2020-12-19
  • 2012-10-25
  • 2013-01-30
  • 2019-05-20
  • 1970-01-01
  • 2021-05-11
  • 2021-05-26
  • 1970-01-01
相关资源
最近更新 更多