gpt4 book ai didi

mongodb - 在嵌套数组中查找第一个符合条件的元素

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

我有以下文件:

doc1: { 
'array': [
{'field': 'ABC', 'enabled': 'false'},
{'field': 'BCD', 'enabled': 'true'},
{'field': 'DEF', 'enabled': 'false'},
{'field': 'XYZ', 'enabled': 'true'},
]
}


doc2: {
'array': [
{'field': 'ABC', 'enabled': 'true'},
{'field': 'BCD', 'enabled': 'true'},
{'field': 'DEF', 'enabled': 'false'},
{'field': 'XYZ', 'enabled': 'true'},
]
}

我正在按特定字段执行搜索。我想获取所有启用了该字段的文档,并且在此之前(列表中)没有启用其他字段。

例如:

搜索字段:BCD , enabled: true - 应该只返回第一个文档(因为在第二个文档中也启用了 ABC)。

搜索 XYZ , enabled: true - 根本不应返回任何文档,因为在此列表顶部启用了其他字段。

我正在尝试用 $elemMatch 做某事, 但我不知道是否可以在 elemMatch 的元素之上应用过滤器已匹配。

有什么建议吗?

最佳答案

最好使用 $where 进行搜索除了正常的查询,还在服务器上保留东西:

db.getCollection('collection').find({
"array": {
"$elemMatch": { "field": "BCD", "enabled": "true" },
},
"$where": function() {
return this.array.map((e,i) => Object.assign(e,{ i }))
.filter( e => e.field === "BCD" && e.enabled === "true" )
.map( e => e.i )[0] <=
this.array.map(e => e.enabled).indexOf("true")
}
})

如果您有支持 $indexOfArray 的 MongoDB 3.4和 $range , 那么它可能看起来更长,但实际上使用 $redact 最有效:

db.getCollection('collection').aggregate([
{ "$match": {
"array": {
"$elemMatch": { "field": "BCD", "enabled": "true" },
}
}},
{ "$redact": {
"$cond": {
"if": {
"$lte": [
{ "$arrayElemAt": [
{ "$map": {
"input": {
"$filter": {
"input": {
"$map": {
"input": {
"$zip": {
"inputs": [
"$array",
{ "$range": [0, { "$size": "$array" }] }
]
}
},
"as": "a",
"in": {
"field": { "$arrayElemAt": [ "$$a.field", 0 ] },
"enabled": { "$arrayElemAt": [ "$$a.enabled", 0 ] },
"index": { "$arrayElemAt": [ "$$a", 1 ] }
}
}
},
"as": "a",
"cond": {
"$and": [
{ "$eq": [ "$$a.field", "BCD" ] },
{ "$eq": [ "$$a.enabled", "true" ] }
]
}
}
},
"as": "a",
"in": "$$a.index"
}},
0
]},
{ "$indexOfArray": [ "$array.enabled", "true" ] }
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])

所以实际上并没有强制执行的实际查询操作,但是这两种情况都将选择保留在“服务器上”,而不是通过网络将数据发送到客户端然后进行过滤。

因为如果你这样做,它首先会否定使用数据库的目的。所以你真的希望这发生在服务器上。

关于mongodb - 在嵌套数组中查找第一个符合条件的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45736687/

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