gpt4 book ai didi

MongoDB - 按子文档匹配排序

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

假设我在 MongoDB 中有一个 users 集合。典型的用户文档包含一个名称字段和一个子文档数组,代表用户的特征。像这样说:

{   
"name": "Joey",
"characteristics": [
{
"name": "shy",
"score": 0.8
},
{
"name": "funny",
"score": 0.6
},
{
"name": "loving",
"score": 0.01
}
]
}

我如何找到前 X 位最有趣的用户,并按他们的有趣程度排序?

到目前为止,我发现的唯一方法是在类似于此的查询中使用聚合框架:

db.users.aggregate([
{$project: {"_id": 1, "name": 1, "characteristics": 1, "_characteristics": '$characteristics'}},
{$unwind: "$_characteristics"},
{$match: {"_characteristics.name": "funny"}},
{$sort: {"_characteristics.score": -1}},
{$limit: 10}
]);

这似乎正是我想要的,除了根据 MongoDB's documentation on using indexes in pipelines 的事实, 一旦我在聚合管道中调用 $project$unwind ,我就不能再利用索引来匹配或排序集合,这使得这个解决方案对于一个非常大集合。

最佳答案

我认为您已经完成了一半。我会做

db.users.aggregate([
{$match: { 'characteristics.name': 'funny' }},
{$unwind: '$characteristics'},
{$match: {'characteristics.name': 'funny'}},
{$project: {_id: 0, name: 1, 'characteristics.score': 1}},
{$sort: { 'characteristics.score': 1 }},
{$limit: 10}
])
  • 我添加了一个 match 阶段来摆脱没有 funny 属性(可以轻松索引)的用户。
  • unwindmatch 再次保留数据的特定部分
  • 只保留项目的必要数据
  • 按正确分数排序
  • 限制结果。

这样您就可以为第一个匹配项使用索引。

在我看来,如果您感兴趣的特征不是太多,IMO 最好将您的结构设置为

{  
"name": "Joey",
"shy": 0.8
"funny": 0.6
"loving": 0.01
}

这样您就可以使用索引(稀疏或不稀疏)让您的生活更轻松!

关于MongoDB - 按子文档匹配排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21663036/

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