搜索Mongo集合中的对象数组

时间:2016-07-15 06:45:18

标签: mongodb mongodb-query

我有一个包含一系列对象的集合。我知道如何使用$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' } ] }

如何指定搜索条件以匹配符合以下任一条件的所有记录:

  1. value1 == data_bvalue2 == data_c
  2. value1 == data_xvalue2 == data_y
  3. 我已尝试使用find进行以下操作,但未返回任何结果:

    {'data': {$elemMatch: {$in: [{'value1': 'data_b', 'value2': 'data_c'}, {'value1':'data_x', 'value2': 'data_y'}]}}}
    

2 个答案:

答案 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