Совпадение элементов MongoDB $ в Meteor

#arrays #mongodb #meteor

#массивы #mongodb #метеор

Вопрос:

У меня есть небольшой вопрос о $ elemMatch. Это документ в MongoDB:

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

Я хочу вернуть только foo с v таким же, как в последнем поле. На данный момент я могу сделать что-то вроде этого:

 var a = function(id, version) {
  //id = 'asdf1234'
  //version = '2.0.0'
  return MyCollection.findOne({_id:id}, {fields:{foo:{$elemMatch:{v:version}}});
}
  

и я получу массив foo только с объектом с v: ‘2.0.0’. Но теперь я хочу получить последний объект в массиве, поэтому версия параметра будет «последней», а функция будет выглядеть следующим образом:

 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:

Mongo find предоставит вам полный документ со всеми записями в вашем массиве. Невозможно выбрать один из элементов foo массива с помощью запроса Mongo. Вам нужно найти правильный вложенный документ, как только у вас будет массив.

К счастью, это довольно просто:

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

Комментарии:

1. Однако есть также $elemMatch проекция, которая в основном позволяет фильтровать элементы массива: docs.mongodb.org/manual/reference/operator/projection/elemMatch