MongoDB的更新/阵列的Upsert准确匹配

问题描述:

我有一个集合:MongoDB的更新/阵列的Upsert准确匹配

​​

我希望能够以更新的标准定数组的数组的统计信息的文件(精确匹配)。

我尝试这样做2个阶段:

db.gStats.update({ 
    "criteria" : {$size : 2}, 
    "criteria" : {$all : [{"key1" : "2096955"},{"value1" : "2015610"}]} 
}, 
{ 
    $pull : {groups : {"id" : "XXXX"}} 
} 
) 

推新文件

db.gStats.findAndModify({ 
    query : { 
     "criteria" : {$size : 2}, 
     "criteria" : {$all : [{"key1" : "2015610"}, {"key2" : "2096955"}]} 
    }, 
    update : { 
     $push : {groups : {"id" : "XXXX", "visited" : 29, "liked" : 144}} 
    }, 
    upsert : true 
}) 

的:

从给定的 “ID” 的阵列拉统计文件拉查询完美。

2014-12-13T15:12:58.571+0100 findAndModifyFailed failed: { 
     "value" : null, 
     "errmsg" : "exception: Cannot create base during insert of update. Cause 
d by :ConflictingUpdateOperators Cannot update 'criteria' and 'criteria' at the 
same time", 
     "code" : 12, 
     "ok" : 0 
} at src/mongo/shell/collection.js:614 

无论查询是在现实工作: 推式查询提供了一个错误。除非在运营商和$and之下,您不能使用像“标准”这样的密钥名称。您还指定不同的字段(即组)和查询样本文档中不存在的元素。

很难说出你真正想在这里做什么。但是这个错误主要是由我提到的第一个问题引起的,另外还有一些额外的东西。所以真的你的{ "$size": 2 }条件被忽略,只有第​​二个条件适用。

有效查询形式应该是这样的:

query: { 
    "$and": [ 
     { "criteria" : { "$size" : 2 } }, 
     { "criteria" : { "$all": [{ "key1": "2015610" }, { "key2": "2096955" }] } } 
    ] 
} 

作为每组条件由$and查询的文档结构是有效的,不具有散列键名提供的阵列内指定的覆盖另一个。这是编写你的两个条件的正确方法,但是有一个技巧使得“upsert”由于那些条件与文档不匹配而失败。我们需要重写发生了什么事时,它尝试应用上创建$all参数:

update: { 
    "$setOnInsert": { 
     "criteria" : [{ "key1": "2015610" }, { "key2": "2096955" }] 
    }, 
    "$push": { "stats": { "id": "XXXX", "visited": 29, "liked": 144 } } 
} 

使用$setOnInsert这样,当“更新插入”被应用在这里所规定的条件,而不是使用一个新的文档创建替代地使用在语句的查询部分中设置的字段值。

当然,如果你真正需要的是真正的数组中的内容的精确匹配,那么只需要使用的查询,而不是:

query: { 
    "criteria" : [{ "key1": "2015610" }, { "key2": "2096955" }] 
} 

然后MongoDB的会很乐意在创建新文档时应用这些值,并且不会对如何解释$all表达式感到困惑。

+1

请注意,对于'criteria'上的两个条件,您不需要'$和'。条件可以按照“条件”来构造:{“$ size”:2,“$ all”:[{“key1”:“2015610”},{“key2”:“2096955”}]}' – wdberkeley 2014-12-15 17:25:20