我正在尝试查找给定的rs中是否存在type = conv,而rs在d-> ds-> rs->类型中存在。
{
"_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'}}
]
}
输出
它正在返回我的文档,我想它是在整个文档中寻找type = conv的存在,即使它不存在于ds2(d2的一部分)上,而是存在于ds1(d1的一部分)上。
我们有没有更简单的方法来找到它是否存在,我想先找到然后使用数组过滤器,我们可以更新深度嵌套数组中的特定元素。
有人可以建议我该如何解决这个问题? (如果我们有任何不使用聚合的解决方案)
答案 0 :(得分:1)
对于这些类型的条件,您需要使用 $ elemMatch ,并且无需$ eq运算符即可匹配字符串
filter = {"$and": [
{"c_name": "c1"},
{"t_name": "t1"},
{ "d": { $elemMatch: { "name": "d2", "ds.name": "ds2" , "ds.rs.type": "conv"} } }
]}
使用$ elemMatch仅在所有条件都为真的数组中搜索
答案 1 :(得分:0)
感谢@puneet,我需要在上面尝试。但是,我现在正在使用这个
filter_query = {
"$and": [
{"c_name": {'$eq': 'c1'}},
{"t_name": {'$eq': 't1'}},
{
'd': {
'$elemMatch': {
'name': 'd2',
'ds': {
'$elemMatch':
{'name': 'ds2',
'rs':
{'$elemMatch':
{
"type": 'conv'}
}
}
}
}
}
}]}
这也有效!