给定以下MongoDB集合:
[
{
"_id": 1,
"basket": [
{
"key": "A",
"value": [
"Bananas"
]
},
{
"key": "B",
"value": [
"Apples"
]
}
]
},
{
"_id": 2,
"basket": [
{
"key": "A",
"value": [
"Oranges"
]
},
{
"key": "B",
"value": [
"Bananas"
]
}
]
},
{
"_id": 3,
"basket": [
{
"key": "A",
"value": [
"Bananas"
]
},
{
"key": "B",
"value": [
"Bananas"
]
}
]
},
{
"_id": 4,
"basket": [
{
"key": "A",
"value": [
"Oranges"
]
},
{
"key": "B",
"value": [
"Apples"
]
}
]
}
]我想查询这个集合,以获得篮子'A‘和'B’上出现“香蕉”的所有文档,这意味着预期的结果将是
[
{
"_id": 3,
"basket": [
{
"key": "A",
"value": [
"Bananas"
]
},
{
"key": "B",
"value": [
"Bananas"
]
}
]
}
]这是实际结果:
[
{
"_id": 1,
"basket": [
{
"key": "A",
"value": [
"Bananas"
]
},
{
"key": "B",
"value": [
"Apples"
]
}
]
},
{
"_id": 2,
"basket": [
{
"key": "A",
"value": [
"Oranges"
]
},
{
"key": "B",
"value": [
"Bananas"
]
}
]
},
{
"_id": 3,
"basket": [
{
"key": "A",
"value": [
"Bananas"
]
},
{
"key": "B",
"value": [
"Bananas"
]
}
]
}
]因此,由于某些原因,我不太明白为什么,我得到所有的文档,其中“香蕉”出现在任何篮子,而我应该只得到文档与_id: 3
这是我使用的查询:
{
$and: [
{
$and: [
{ "basket.value": { $in: ["Bananas"] } },
{ "basket.key": { $eq: "A" } }
]
},
{
$and: [
{ "basket.value": { $in: ["Bananas"] } },
{ "basket.key": { $eq: "B" } }
]
}
]
}发布于 2022-03-08 20:40:51
尝试运行使用$expr运算符的查询,因为它允许您利用最适合上述查询的聚合管道运算符。本质上,您需要在上述条件下筛选购物篮数组,即"Bananas"值在values数组中的位置,以及key值为'A‘或'B’的位置。在聚合管道中表示的这一条件如下:
{
$and: [
{ $in: ['Bananas', '$$basket_element.value'] },
{ $in: ['$$basket_element.key', ['A', 'B'] ] }
]
}这个过滤后的数组的长度应该等于2,这样才能满足整个查询,因此需要操作符。
总的来说,您的查询应该如下所示:
db.collection.find({
$expr: {
$eq: [
{ $size: {
$filter: {
input: '$basket',
as: 'basket_element',
cond: {
$and: [
{ $in: ['Bananas', '$$basket_element.value'] },
{ $in: ['$$basket_element.key', ['A', 'B'] ] }
]
}
}
} },
2
]
}
})https://stackoverflow.com/questions/71400237
复制相似问题