我在使用 MongoDB 查询时遇到问题,这是 MongoDB 中的数据结构:
{
"_id": "aaaaa",
"groups": [
{
"name": "group0",
"props": {
"unknown1": "value1",
"unknown2": "value2",
"unknown3": "value3"
}
},
{
"name": "group1",
"props": {
"unknown4": "value4",
"unknown5": "value5",
"unknown6": "value6"
}
}
]
}
我想查询嵌套字段具有特定值但键未知的文档,例如: groups[X].props.unknownX.valueX = valueA。
我尝试使用下面的聚合查询:
db.collection.aggregate([
{
$project: {
"props": "$groups.props"
}
},
{
$unwind: "$props"
},
{
$project: {
"result": {
$objectToArray: "$props"
}
}
},
{
$match: {
$and: [
{
"result.k": "unknown2",
"result.v": "value1"
}
]
}
},
{
"$project": {
result: {
"$arrayToObject": "$result"
}
}
}
])
沙盒:https://mongoplayground.net/p/71TYThQnxTP
结果是:
[
{
"_id": "aaaaa",
"result": {
"unknown1": "value1",
"unknown2": "value2",
"unknown3": "value3"
}
}
]
但我希望它是:
[]
不应该是数组,因为我通过查询条件使用了$and操作
props.unknown2 = value1
。但好像又回来了props.unknown2 exists and props.unknownX.value1 exists
,我是不是做错了什么?
有人可以帮忙吗?我将不胜感激。谢谢!
您当前使用
$match
阶段条件的查询仅显示键和值存在。但是它不能保证键和值必须在同一个对象(键值对)中。
您应该使用
$filter
运算符按键和值过滤数组中的元素。接下来,通过不等于空数组[]
比较过滤后的数组来过滤(根文档)。
{
$match: {
$expr: {
$ne: [
{
$filter: {
input: "$result",
cond: {
$and: [
{
$eq: [
"$$this.k",
"unknown2"
]
},
{
$eq: [
"$$this.v",
"value1"
]
}
]
}
}
},
[]
]
}
}
}
通过构建您的搜索条件,可以使用最短的查询来实现类似的结果,例如:
db.collection.aggregate([
{
$match: {
"groups.props.{key}": "{value}"
}
}
])
因此将
{key}
和 {value}
替换为:
db.collection.aggregate([
{
$match: {
"groups.props.unknown2": "value1"
}
}
])