【问题标题】:Finding if the document is unique查找文档是否唯一
【发布时间】:2017-06-27 15:48:54
【问题描述】:

我在 MongoDB 中查询 3 个集合,然后通过从 3 个单独集合的文档中获取一些字段来创建一个新文档。例如:我从第一个集合中获取字段“A”,从第二个集合中获取字段“B”,从第三个集合中获取字段“C”。

使用它们我正在创建一个类似的 json 文档

var uploadDoc = {
                   'A' : <value of A>,
                   'B' : <value of B>,
                   'C' : <value of C>,
                }

此 uploadDoc 正在上传到另一个集合。

问题:我希望只上传不同的 uploadDoc 值。默认情况下,MongoDB 为每个 uploadDoc 提供一个唯一的 id。仅当之前未插入具有相同 A、B 和 C 值的另一个文档时,如何将 uplodDocs 插入集合?

我正在使用 javascript 来查询集合并创建文档。

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    两种方法都很简单:

    1. 使用“更新”

      db.collection.update(uploadDoc,uploadDoc,{ "upsert": true })
      
    2. 使用唯一索引

      db.collection.ensureIndex({ "A": 1, "B": 1, "C": 1 },{ "unique": true });
      db.collection.insert(uploadDoc); // Same thing fails :(
      

    两者都有效。选择一个。

    【讨论】:

    • @displayName 第一种方法是查找符合条件的文档并尝试更新它。如果实际上没有任何改变,那么 MongoDB 并没有真正做任何事情。如果未找到该文档,则创建一个新文档。所有的解释都在手册页中。
    【解决方案2】:

    您应该使用唯一索引:doc

    你不应该在没有唯一索引的情况下使用 upsert:

    为避免多次插入同一个文档,仅当查询字段被唯一索引时才使用 upsert: true

    因为

    考虑当多个客户端同时使用 upsert 参数发出以下更新时:

    [剪切]

    如果所有 update() 操作在任何客户端成功插入数据之前完成查询部分,并且 name 字段上没有唯一索引,则每个更新操作都可能导致插入。

    from here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-27
      • 2016-09-26
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-25
      相关资源
      最近更新 更多