gpt4 book ai didi

mongodb 查询以查找数组中的对象与另一个数组字段的元素不匹配的位置

转载 作者:可可西里 更新时间:2023-11-01 09:14:09 26 4
gpt4 key购买 nike

我收集了如下文件:

{
_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的结果.这样做是为了查看“交集”,因为这里没有具体的内容表明一个是另一个的“子集”。所以这只是公共(public)元素,否则就有$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 作为可以进行这种比较的两个工具。

关于mongodb 查询以查找数组中的对象与另一个数组字段的元素不匹配的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35447910/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com