我试图寻找在给定的rs中是否存在type=conv,它存在于d--> ds--> rs--> type。
{
"_id" : ObjectId("5ec25873bd796ff191e695b1"),
"c_name" : "c1",
"t_name" : "t1",
"d" : [
{
"name" : "d1",
"ds" : [
{
"name" : "ds1",
"rs" : [
{
"type" : "conv"
}
]
}
]
},
{
"name" : "d2",
"ds" : [
{
"name" : "ds2",
"rs" : []
}
]
}
]
}
查询:
filter = {
"$and": [
{"c_name": {'$eq': 'c1'}},
{"t_name": {'$eq': 't1'}},
{"d.name": {'$eq': 'd2'}},
{"d.ds.name": {'$eq': 'ds2'}},
{"d.ds.rs.type": {'$eq': 'conv'}}
]
}
OUTPUT
它正在返回我的文档,我想它正在寻找类型=conv在完整文档中的存在,即使它不存在于ds2(d2的一部分),但存在于ds1(d1的一部分)。
我们有没有更简单的方法来查找它是否存在,我想先找到,然后使用数组过滤器,我们可以更新深嵌套数组内的特定元素。
谁能告诉我应该如何解决这个问题?(如果我们有不使用聚合的解决方案的话)
你需要使用 $elemMatch 对于这些类型的条件,你可以在没有$eq操作符的情况下匹配字符串。
filter = {"$and": [
{"c_name": "c1"},
{"t_name": "t1"},
{ "d": { $elemMatch: { "name": "d2", "ds.name": "ds2" , "ds.rs.type": "conv"} } }
]}
使用$elemMatch,它将只在所有条件为真的数组中进行搜索。
谢谢 @puneet ,我需要尝试以上。然而,我现在使用的是这个
filter_query = {
"$and": [
{"c_name": {'$eq': 'c1'}},
{"t_name": {'$eq': 't1'}},
{
'd': {
'$elemMatch': {
'name': 'd2',
'ds': {
'$elemMatch':
{'name': 'ds2',
'rs':
{'$elemMatch':
{
"type": 'conv'}
}
}
}
}
}
}]}
这也是工作!!!!!!!!!!。