我有一个关于$ elemMatch的小问题。这是MongoDB中的一个文档:
{
_id:'asdf1234',
latest: '2.0.0',
foo : [{
v : '1.0.0',
text : "Hello"
},{
v: '2.0.0',
text : "Hello v2.0.0"
}]
}
我想只返回 v 与最新字段相同的foo。现在我可以这样做:
var a = function(id, version) {
//id = 'asdf1234'
//version = '2.0.0'
return MyCollection.findOne({_id:id}, {fields:{foo:{$elemMatch:{v:version}}});
}
我将只使用v:'2.0.0'的对象获取foo数组。但是现在我想在数组中获取最新的对象,所以参数 version 将是'latest',函数将如下所示:
var a = function(id, version) {
//id = 'asdf1234'
//version = 'latest'
if(version != 'latest') {
return MyCollection.findOne({_id:id}, {fields:{foo:{$elemMatch:{v:version}}});
} else {
var doc = MyCollection.findOne({_id:id});
//Some code to get object where v == doc.latest
}
}
现在问题 - 我可以通过一个查询从foo数组中获取元素,如下所示:
MyCollection.findOne({_id:id}, {fields:{foo:{$elemMatch:{v:'$latest? or fields.latest?'}}});
我不想迭代数组来获取最新元素。当然,如果没有机会这样做,我会写代码:)
感谢您的回答!
答案 0 :(得分:3)
Mongo find会为您提供完整文档以及数组中的所有条目。使用Mongo查询无法选择其中一个foo
数组的项目。一旦有了数组,你需要找到正确的子文档。
幸运的是,这很简单:
_.find(doc.foo, function(item) {return item.v === doc.latest});