我有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 $或运算符的方法是否正确?
答案 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
文档。