#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