【问题标题】:MongoDB $elemMatch in Meteor流星中的 MongoDB $elemMatch
【发布时间】:2023-03-15 21:45:01
【问题描述】:

我有一个关于 $elemMatch 的小问题。这是 MongoDB 中的文档:

{
  _id:'asdf1234',
  latest: '2.0.0',
  foo : [{
    v : '1.0.0',
    text : "Hello"
  },{
    v: '2.0.0',
    text : "Hello v2.0.0"
  }]
}

我只想返回 vlatest 字段中相同的 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 将是“最新的”并且函数看起来像这样:

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?'}}});

我不想遍历数组来获取最新元素。当然,如果没有机会像这样得到它,我会写寻找代码:)

感谢您的任何回答!

【问题讨论】:

    标签: arrays mongodb meteor


    【解决方案1】:

    Mongo find 将为您提供包含数组中所有条目的完整文档。无法使用 Mongo 查询选择 foo 数组的项目之一。拥有数组后,您需要找到正确的子文档。

    幸运的是,这很简单:

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

    【讨论】:

    猜你喜欢
    • 2015-07-24
    • 2013-11-24
    • 2016-12-22
    • 1970-01-01
    • 2012-04-29
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多