我有几个“产品”的对象: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,但收到与上述相同的输出。它似乎并没有将排序逻辑应用在一起,因为我打算这样做,即“通过匹配'twitter'的social_stat元素排序”。
我正在寻找
- 如何改变我的查询,以反映订单的应用()来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查询翻译成工作与Mongoid。 –