我有一个包含一系列对象的集合。我知道如何使用$elemMatch
来搜索一个对象作为参数,但我需要一种方法来使用数组中多个对象的值。
样品采集:
{ '_id' : ObjectId('5788804292a1c428cd5377ff'), 'index' : 'a', 'data' : [ { 'value0' : 'data_a' }, { 'value1' : 'data_b' }, { 'value2' : 'data_c' } ] }
{ '_id' : ObjectId('5788804b92a1c428cd537800'), 'index' : 'b', 'data' : [ { 'value0' : 'data_a' }, { 'value1' : 'data_x' }, { 'value2' : 'data_c' } ] }
{ '_id' : ObjectId('5788805592a1c428cd537801'), 'index' : 'c', 'data' : [ { 'value0' : 'data_a' }, { 'value1' : 'data_x' }, { 'value2' : 'data_y' } ] }
如何指定搜索条件以匹配符合以下任一条件的所有记录:
value1 == data_b
和value2 == data_c
value1 == data_x
和value2 == data_y
我已尝试使用find
进行以下操作,但未返回任何结果:
{'data': {$elemMatch: {$in: [{'value1': 'data_b', 'value2': 'data_c'}, {'value1':'data_x', 'value2': 'data_y'}]}}}
答案 0 :(得分:1)
如果您打算匹配:
({value1: data_b} AND {value2: data_c}) OR ({value1: data_x} AND {value2: data_y})
然后您可以使用此查询,这是上述逻辑的直接翻译:
db.collection.find(
{$or: [
{'data.value1': 'data_b', 'data.value2': 'data_c'},
{'data.value1': 'data_x', 'data.value2': 'data_y'}
]}
)
应返回示例中的两个文档:
{
"_id": ObjectId("5788804292a1c428cd5377ff"),
"index": "a",
"data": [
{
"value0": "data_a"
},
{
"value1": "data_b"
},
{
"value2": "data_c"
}
]
}
{
"_id": ObjectId("5788805592a1c428cd537801"),
"index": "c",
"data": [
{
"value0": "data_a"
},
{
"value1": "data_x"
},
{
"value2": "data_y"
}
]
}
请注意,使用顶级$or
运算符的查询 $or
运算符的所有项都必须具有索引。否则,MongoDB将执行收集扫描,这将是性能问题,并可能使您的工作集移出内存。
有关详细信息,请参阅https://docs.mongodb.com/manual/reference/operator/query/or/#op._S_or。
答案 1 :(得分:0)
{'data': {$all: [{'value1': 'data_b', 'value2': 'data_c'}, {'value1':'data_x', 'value2': 'data_y
“}]}}
使用$ all