我收集了如下文件:
{
_id: ObjectId("55b164c65c1a8f360078c917"),
message_id: ["abc","def"],
message: [{message_id: "efgh", message_body: "somebody"}]
}
我想找出mongodb查询来找出那些message.message_id不在message_id中的文档。谁能帮我这个忙。
可能与MongoDB的2.6和更大的用途,最好的办法.aggregate()
有$redact
:
db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$gt": [
{ "$size": {
"$setIntersection": [
{ "$map": {
"input": "$message",
"as": "msg",
"in": "$$msg.message_id"
}},
"$message_id"
]
}},
0
]
},
"then": "$$PRUNE",
"else": "$$KEEP"
}
}}
])
逻辑的“由内而外”$map
是用来从“ messages”数组中取出“ message_id”的键,然后将其返回以与“ message_id”数组本身进行比较以查看的结果$setIntersection
。通过这种方式可以看到“交集”,因为这里没有具体的内容说一个是另一个的“子集”。因此,这只是常见的元素,否则存在$setIsSubset
。
自然,如果该$size
交点的大于0
,则存在元素匹配。这样该true
条件将被“修剪”,而其他任何条件都将被“保留”。
或者在以前的版本中,$where
与此JavaScript eval一起使用,遵循完全相同的逻辑:
db.collection.find({
"$where": function() {
var self = this;
return self.message.map(function(el) {
return el.message_id;
}).filter(function(el) {
return self.mesage_id.indexOf(el) != -1
}).length == 0;
}
})
在较早的版本中,还可以对聚合管道进行另一种处理,但是这将需要多个管道阶段,因此需要完成数遍操作。因此,这不是MongoDB 2.6之前的最佳选择。
无论如何,标准查询操作通常无法将文档的一个元素与另一个元素进行“比较”。因此,这留下了聚合框架或$where
作为可以进行此比较的两个工具。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句