【发布时间】:2018-01-25 20:16:08
【问题描述】:
我有学生收集的 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 的文档满足所有条件,应该是查询的输出。我试图通过在$elemMatch 运算符中使用$or 和$and 运算符来解决这些条件,但不确定我的方法是否正确。我的查询如下所示
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 AND $or 运算符的方法是否正确?
【问题讨论】:
-
您可以通过显示多个示例文档并使其至少有一个文档符合您的条件而其他文档明显不符合您的条件来扩展这一点。我对您的逻辑的解释是,您目前提供的唯一文档实际上 NOT 与条件匹配,因为该数组包含您要求排除的
'title'和'university'值。所以你真的应该表现出至少一个积极的一面和一些消极的一面。请注意为呈现人们可以复制、粘贴和测试的有效数据格式所做的编辑。 -
好的,谢谢@Neil Lunn,对于您的建议,我会尽力纠正错误
-
我已经扩展了我的问题的详细信息,现在我添加了名称为:QQQ 的文档,它满足给定的条件
标签: node.js mongodb mongodb-query