Meteor中的MongoDB $ elemMatch

时间:2014-06-17 14:25:42

标签: arrays mongodb meteor

我有一个关于$ 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?'}}});

我不想迭代数组来获取最新元素。当然,如果没有机会这样做,我会写代码:)

感谢您的回答!

1 个答案:

答案 0 :(得分:3)

Mongo find会为您提供完整文档以及数组中的所有条目。使用Mongo查询无法选择其中一个foo数组的项目。一旦有了数组,你需要找到正确的子文档。

幸运的是,这很简单:

_.find(doc.foo, function(item) {return item.v === doc.latest});