【问题标题】:mongoDB adding data to Collections without an _id fieldmongoDB 将数据添加到没有 _id 字段的集合
【发布时间】:2011-07-26 15:59:21
【问题描述】:

这是我之前关于为副本集设置不同数据的问题的后续, 我发现您可以为每个要读取的副本指定一个集合,并且您实际上可以模拟 oplog.rs。

由于这些文件的信息不同,因此副本最终不会出现错误消息指出它不同步。

但是,我目前唯一遇到的大问题是,当您将数据添加到集合时,_id 字段会自动生成。

有没有办法让我绕过这个 _id 生成并将信息添加到集合中?如果不是,是否将已经显示在正在添加的文档中的_id字段视为文档_id?

感谢您的贡献, 贡萨洛

PS:再次强调,这是 java/jsp 项目的一部分,如果该领域的任何人可以协助执行此操作,请这样做!

【问题讨论】:

    标签: java jsp mongodb mongodb-java


    【解决方案1】:

    没关系,在官方论坛上找到了答案, 为了进一步参考,我将留下我从那里得到的最终答案。


    注意:根据 mongoDB 开发人员的说法,这个答案应该是有效的,但是,我无法让它正常工作,请自行决定使用,如果发生错误,好吧,加入错误报告的乐趣!

    为了能够在没有“_id”字段的情况下将文档添加到集合中,首先我们需要创建一个 Capped Collection,这个 Capped Collection(据推测并且根据文档,这些集合需要设置最大大小) 默认情况下添加没有“_id”字段的文档,但是在某些情况下,他们可能会添加“_id”字段,在这种情况下,我们将“autoIndexId”指定为 false,这(假设)会覆盖任何默认值并设置集合不将“_id”字段设置为索引,以便我们稍后删除它。

    所以,回顾一下,第 1 步:
    我们创建了一个上限集合:

    db.createCollection("cappedcoll", {capped:true, size:100000});

    第二步:
    测试集合以检查它是否确实生成了“_id”字段。

    如果它没有生成。为什么,你很幸运!恭喜! 如果它确实生成。第 3 步:
    我们创建一个将 autoIndexId 字段设置为 false 的 Capped Collection:

    db.createCollection("cappedcoll", {capped:true, size:100000, autoIndexId:false});
    第四步:
    我们向集合中添加一个项目,然后通过更新删除“_id”字段:

    db.cappedcoll.insert({"names": {"First": "Gonza", "Last": "Vieira"}}); db.cappedcoll.update({"names.First": "Gonza"},{$unset: {"_id":1}});

    如果你到达这部分,那么它要么工作,要么你得到一个讨厌的"cannot modify "_id"" 错误消息,它不应该出现,因为我们将“_id”设置为不是集合的索引......

    这也意味着你和我处于完全相同的阶段。
    祝你好运,我希望他们能尽快解决这个问题,或者这里有人补充这篇文章并纠正我所说的任何错误。

    【讨论】:

    • 不管你做什么,它仍然会生成_id。我使用的是 3.1 版。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 2015-04-23
    • 1970-01-01
    • 2019-02-24
    • 2013-11-27
    相关资源
    最近更新 更多