У меня есть несколько «продукта» объекты:MongoDB: совпадение и сортировка по элементу массива?
{ name: 'ProductA',
social_stats: [
{ name: 'facebook',
shares: 60
},
{ name: 'twitter',
shares: 0
}
]
}
{ name: 'ProductB',
social_stats: [
{ name: 'facebook',
shares: 0
},
{ name: 'twitter',
shares: 30
}
]
}
Я хотел бы запросить «наиболее общие продукты на Facebook» и «наиболее общих продукты на Twitter», всегда отсортированные от наиболее до наименее акций.
Так что мой первый запрос для Facebook выглядит как:
db.videos.find({
_id: {
social_stats: {
$elemMatch: {
name: 'facebook'
}
}
}
).sort({
social_stats: {
shares: -1
}
})
Урожайность:
{ name: 'ProductA' }
{ name: 'ProductB' }
Это «правильный», но когда я запускаю тот же запрос для «твиттере» вместо этого, я ожидаю, B-> A, но получить тот же результат, что и выше. Похоже, что мы не применяем логику сортировки &, так как я предполагаю, что «упорядочивается элементом social_stat, который соответствует« twitter ».
Что я ищу
- Как изменением мой запрос, чтобы отразить применение порядка(), чтобы соответствовать social_stat элементов?
- Если это невозможно с этими обычными запросами MongoDB, это то, что я могу сделать с помощью структуры агрегации? И как это будет выглядеть?
- Тогда как бонус, как бы закодировать эквивалентный запрос с Mongoid?
Некоторые родственные связи, я посмотрел на:
- Найдено this similar post (это означает, что нужно использовать структуру агрегации?)
- $elemMatch operator
- Aggregation operators
Это должно быть легко перевести на Mongoid, но [Mongoid и MongoDB Aggregation Framework] (http://blog.joshsoftware.com/2013/09/05/mongoid-and-the-mongodb-aggregation-framework/) может быть полезным началом. – Stennie
Это именно то, что я закончил делать, и структура агрегации отлично справилась с этим. У Mongoid есть функция Model.collection.aggregate() ', которую вы можете передать массиву команд для выполнения (например,' [match, unwind, match, sort, project] '), поэтому он был довольно тривиальным, переводя запрос MongoDB с Монгоидом. –