Mongodb 查找文档是否唯一

Mongodb 查找文档是否唯一,mongodb,mongodb-query,Mongodb,Mongodb Query,我在MongoDB中查询3个集合,然后通过从3个单独集合的文档中获取一些字段来创建一个新文档。例如:我从第一个集合中提取字段“A”,从第二个集合中提取字段“B”,从第三个集合中提取字段“C” 使用它们,我创建了一个json文档,如 var uploadDoc = { 'A' : <value of A>, 'B' : <value of B>, 'C' : &

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

使用它们,我创建了一个json文档,如

var uploadDoc = {
                   'A' : <value of A>,
                   'B' : <value of B>,
                   'C' : <value of C>,
                }
var uploadDoc={
“A”:,
“B”:,
“C”:,
}
此上载文档正在上载到另一个集合

问题:我只想上传uploadDoc的不同值。默认情况下,MongoDB为每个uploadDoc提供一个唯一的id。只有在以前没有插入具有相同a、B和C值的另一个文档时,我如何向集合插入
uplodDoc
s

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

有两种方法很简单:

  • 使用“upserts”

    db.collection.update(uploadDoc,uploadDoc,{“upsert”:true})
    
  • 使用唯一索引

    db.collection.ensureIndex({“A”:1,“B”:1,“C”:1},{“unique”:true});
    db.collection.insert(uploadDoc);//同样的事情失败了:(
    

  • 两者都有效。选择一个。

    您应该使用唯一索引:

    如果没有唯一索引,则不应使用upsert:

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

    因为

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

    [剪辑]

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


    @displayName第一种方法是查找符合条件的文档并尝试更新它。如果没有任何更改,则MongoDB不会真正执行任何操作。如果找不到该文档,则会创建一个新文档。所有这些都在手册页面中进行了说明。