gpt4 book ai didi

performance - MongoDB:按名称未知的子文档排序

转载 作者:可可西里 更新时间:2023-11-01 10:31:08 27 4
gpt4 key购买 nike

我有一个像这样的 MongoDB 集合:

{
id: "213",
sales : {
'2014-05-23': {
sum: 23
},
'2014-05-22': {
sum: 22
}
}
},

{
id: "299",
sales : {
'2014-05-23': {
sum: 44
},
'2014-05-22': {
sum: 19
}
}
},

我正在寻找一个查询,以让我的集合中的所有文档按总和排序(总和最大的文档...)。

对于示例数据,它应该返回如下内容:

{
id: "299",
sales : {
'2014-05-23': {
sum: 44
},
'2014-05-22': {
sum: 19
}
}
},
{
id: "213",
sales : {
'2014-05-23': {
sum: 23
},
'2014-05-22': {
sum: 22
}
}
},

因为:和44最大,所以集合中的这个文档先显示。

这可能(并且足够快)吗?否则我可以重新设计数据库 - 也许有人对此有建议?

最佳答案

这样做的性能很糟糕,因为您放弃了最好的选择,即聚合框架。

您在这里违反的主要规则是“不要使用数据作为键”。

因此,当您使用实际上是数据点的“键”命名“子文档”时,就没有简单的方法来处理它们。一般的 MongoDB 符号不喜欢这样,你被迫进行 JavaScript 评估。这仍然是“ Sprite ”,但与 native 方法相比确实

改变你的模式,然后你就可以使用聚合框架了。首先是更改:

{
"_id": 123,
"sales": [
{ "date": ISODate("2014-05-23T00:00:00Z"), "sum": 23 },
{ "date": ISODate("2014-05-22T00:00:00Z"), "sum": 22 }
]
},
{
"_id": 299,
"sales": [
{ "date": ISODate("2014-05-22T00:00:00Z"), "sum": 19 },
{ "date": ISODate("2014-05-23T00:00:00Z"), "sum": 44 }
]
}

现在你的数据在一个数组中并且“路径”是一致的,这意味着你可以很容易地排序:

db.collection.find().sort({ "sales.sum": -1 })

因此具有“最大”“sales.sum”值的文档将排在第一位。

如果给出上面的示例,您还想按最大的“sales.sum”对内部数组元素进行“排序”,那么您可以使用聚合框架:

db.collection.aggregate([
{ "$unwind": "$sales" },
{ "$sort": { "_id": 1, "sales.sum": -1 } },
{ "$group": {
"_id": "$_id",
"sales": { "$push": "$sales" }
}},
{ "$sort": { "sales.sum": -1 } }
])

可以通过将 JavaScript 评估与 mapReduce 一起使用来以这种方式处理您当前的文档,但不要这样做,因为它会慢得多。

关于performance - MongoDB:按名称未知的子文档排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24824397/

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