gpt4 book ai didi

MongoDB:对数组元素进行匹配和排序?

转载 作者:可可西里 更新时间:2023-11-01 09:27:34 26 4
gpt4 key购买 nike

我有一些“产品”对象:

{ 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' }

这是“正确的”,但是当我对“twitter”运行相同的查询时,我期望 B->A,但收到与上面相同的输出。它似乎没有按照我的意图一起应用 where & sort 逻辑,即“按与‘twitter’匹配的 social_stat 元素排序”。

我在找什么

  • 如何更改我的查询以反射(reflect) order() 对匹配的 social_stat 元素的应用?
  • 如果无法使用这些普通的 MongoDB 查询,我可以使用聚合框架来做这件事吗?那会是什么样子?
  • 那么作为奖励,如何使用 Mongoid 编写等效查询的代码?

我看过的一些相关链接:

最佳答案

您不能通过数组对结果进行sort(),因此这不会实现您想要的结果。

最好的方法(在 MongoDB 2.4 中)是使用聚合框架:

db.videos.aggregate(
// Optional: potentially take advantage of an index to only find videos with
// facebook stats; could also limit to those with shares $gt 0
{ $match: {
'social_stats.name' : 'facebook'
}},

// Convert the social_stats array into a document stream
{ $unwind: '$social_stats' },

// Only match the social stats for facebook
{ $match: {
'social_stats.name' : 'facebook'
}},

// Sort in descending order
{ $sort: {
'social_stats.shares' : -1
}},

// Only include the product names & score
{ $project: {
_id: 0,
name: "$name",
shares: "$social_stats.shares"
}}
)

'twitter' 的结果:

{
"result" : [
{
"name" : "ProductB",
"shares" : 30
},
{
"name" : "ProductA",
"shares" : 0
}
],
"ok" : 1
}

“facebook”的结果:

{
"result" : [
{
"name" : "ProductA",
"shares" : 60
},
{
"name" : "ProductB",
"shares" : 0
}
],
"ok" : 1
}

关于MongoDB:对数组元素进行匹配和排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21052503/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com