如何编写某些对象条件的查询不能在对象数组中,而其他一些对象必须在对象数组中?

时间:2017-08-17 12:07:06

标签: node.js mongodb mongodb-query

我有mongo文档的学生集合,如下所示:

{
  name: 'XYZ',
  age: 26,
  education: [
    { title: 'abc', university: 'pqr', grade: 'A' },
    { title: 'def', university: 'uvq', grade: 'B' },
    { title: 'ghi', university: 'xyz', grade: 'A' },
    { title: 'jkl', university: 'pqr', grade: 'B' },
    { title: 'mno', university: 'uvw', grade: 'C' }
  ]
}, {
  name: 'QQQ',
  age: 26,
  education: [
    { title: 'abc', university: 'pqr', grade: 'A' },
    { title: 'ghi', university: 'xyz', grade: 'A' },
    { title: 'jkl', university: 'xyz', grade: 'B' },
    { title: 'mno', university: 'pqr', grade: 'C' }
  ]
}

现在我想写一个查询,其中我希望必须的学生完成他们的

  

{education-title:'abc' with grade A} {education-title:'def' with grade B}

已完成

  

{education-title:'jkl' with university:pqr}    {education-title:'mno' with university:uvw}

如果仔细观察我的name: QQQ文档符合所有条件,应该是查询的输出。我正在尝试使用$or运算符中的$and$elemMatch运算符来解决这些问题,但不确定我的方法是否正确。我的查询如下所示

studentModel.aggregate({
{
  $match: {
    'education': $elemMatch: {
      $or: [{
          'title': 'abc',
          'grade': 'A'
        },
        {
          'title': 'def',
          'grade': 'B'
        }
      ]},
      $not: {
        $elemMatch: {
          $and: [{
              'title': 'jkl',
              'university': 'pqr'
            },
            {
              'title': 'mno',
              'university': 'uvw'
            }
          ]
        }
    }
  }
});

上面的代码正在工作,并给我输出,但我不确定它是否可以使用数百万的记录,仍然产生预期的输出。我只是想确定我在$ elemMatch中使用$和AND $或运算符的方法是否正确?

1 个答案:

答案 0 :(得分:1)

当我运行你的查询时,它错误地选择了第一个文档,这是因为$not内的第二个条件实际上永远不能匹配一个元素,因为$elemMatch不能包含&# 34;多种条件"对于同一元素上的相同属性$elemMatch正在区分"在同一数组元素上匹配多个条件"。因此命名。

正确的方法是列出"分开" $elemMatch语句并使用$all包装它们:

db.getCollection('students').find({
  "education": {
    "$elemMatch": {
      "$or": [
        { "title": "abc", "grade": "A" },
        { "title": "def", "grade": "B" }
      ]  
    }, 
    "$not": {
      "$all": [
        { "$elemMatch": {
          "title": "jkl", "university": "pqr"
        }},
        { "$elemMatch": {
          "title": "mno", "university": "uvw"  
        }} 
      ]
    }
  }
})

这只能从提供的样本中选择第二个QQQ文档。