gpt4 book ai didi

mongodb - 选择子文档中数组的最后一个值

转载 作者:可可西里 更新时间:2023-11-01 09:43:15 25 4
gpt4 key购买 nike

我有以下文档结构

{ 
"_id" : 1,
"prices" : {
"100" : [
5.67,
.
.
1.7,
],
"101" : [
4.67,
.
.
1.4,
},
"v" : 2
}

我们需要使用 mongodb v3.0.2 从字段“100”和“101”中获取最后一个值,例如 1.7 和 1.4。目前我们正在加载整个文档,然后在应用程序中获取所需的值。它已经成为一个相当大的瓶颈,因为每个文档可能约为 1MB,这对于 100 多个文档来说是加起来的。

我们希望 mongodb 有一个合适的功能,可以让我们只从文档中检索我们需要的数据,可能作为每个价格字段的单独调用,即一次调用价格“100”键,第二次调用调用价格“101”键。

我们已经尝试使用 $slice 运算符,但不幸的是,这不能与排除字段一起使用,https://jira.mongodb.org/browse/SERVER-3378 .

我们还看到了下面的帖子: How to combine both $slice and select returned keys operation in function update?

这几乎可以工作,但是查询的返回值:

db.account_articles.find({"_id" : ObjectId("1")}, { "prices.100" : { $slice: -1 }, "_id" : 1 })

是:

{ 
"_id" : 1,
"prices" : {
"100" : [
1.7
],
"101" : [
4.67,
.
.
1.4,
}
}

即已经完成了 90%,我们只需要能够排除“101”字段即可。

我们是否遗漏了什么或者这在 monogodb 中是不可能的?

最佳答案

你需要聚合框架来做到这一点,我认为你真的应该改变结构,但要使用你所拥有的:

Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } }},
{ "$unwind": "$prices.100" },
{ "$group": {
"_id": "$_id",
"price": { "$last": "$prices.100" }
}},
{ "$project": { "_id": 0, "prices.100": "$price" } }
]
)

在未来的版本中,您将能够只使用新的 $slice 运算符:

Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } } },
{ "$project": {
"_id": 0,
"prices.100": { "$slice": ["$prices.100",-1] }
}}
]
)

事实上,您可以同时处理“两个”字段:

Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } } },
{ "$project": {
"_id": 0,
"prices.100": { "$slice": ["$prices.100",-1] },
"prices.101": { "$slice": ["$prices.100",-1] }
}}
]
)

这比使用 $unwind 处理要好得多和 $last$group 时获取数组的最后一个元素用于取回数据。

它基本上具有与较新形式的常规查询相同的性能。在目前的形式下,速度会变慢。

关于mongodb - 选择子文档中数组的最后一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32115002/

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