gpt4 book ai didi

mongodb - 如何使用数组的最后一个元素对集合进行排序

转载 作者:行者123 更新时间:2023-12-02 17:43:03 25 4
gpt4 key购买 nike

我的问题是,我下面有一个集合,_id 被忽略了

{ "value" : -10, "r" : [ { "v" : 1 }, { "v" : 3 } ] }
{ "value" : 2, "r" : [ { "v" : 4 }, { "v" : 1 } ] }
{ "value" : -100, "r" : [ { "v" : 4 }, { "v" : 1 }, { "v" : 10 } ] }
{ "value" : -3, "r" : [ ] }

然后我要根据数组r的最后一个值对它进行排序,也就是说,我想要下面的结果,

{ "value" : -3, "r" : [ ] } # this one should be either the first one or the last one
{ "value" : 2, "r" : [ { "v" : 4 }, { "v" : 1 } ] }
{ "value" : -10, "r" : [ { "v" : 1 }, { "v" : 3 } ] }
{ "value" : -100, "r" : [ { "v" : 4 }, { "v" : 1 }, { "v" : 10 } ] }

我知道我可以按数组 r 的第一个值排序

db.my.find().sort({'r.0.v': 1})

但是如何通过最后一个值来做到呢?

并且,如果使用下面的 mongoengine 模型

class V(EmbeddedDocument):
v = IntField()

class M(Document):
value = IntFiled
r = ListField(EmbeddedDocumentField(V))

我应该如何使用 mongoengine? IntField 可能是其他字段,例如 DateTimeFieldStringField ...

谢谢

最佳答案

如果可能,我建议您始终(加倍)存储要排序的值。将其放入数组和第二个字段中。每当您将新值推送到数组(或存储数组)时,添加一个与“数组中的最后一个值”相对应的新字段,然后对其进行索引和排序。在下面的示例中,我将其命名为 lastR:

{ "value" : -10, "r" : [ { "v" : 1 }, { "v" : 3 } ], "lastR": 3 }
{ "value" : 2, "r" : [ { "v" : 4 }, { "v" : 1 } ], "lastR": 1 }
{ "value" : -100, "r" : [ { "v" : 4 }, { "v" : 1 }, { "v" : 10 } ], "lastR": 10 }
{ "value" : -3, "r" : [ ] }

创建索引:

db.so.ensureIndex({lastR: 1})

然后使用:

> db.so.find().sort({lastR: 1})
{ "_id" : ObjectId("5203a1c83c5438af60de63a1"), "value" : -3, "r" : [ ] }
{ "_id" : ObjectId("5203a1ad3c5438af60de639f"), "value" : 2, "r" : [ { "v" : 4 }, { "v" : 1 } ], "lastR" : 1 }
{ "_id" : ObjectId("5203a1d33c5438af60de63a2"), "value" : -10, "r" : [ { "v" : 1 }, { "v" : 3 } ], "lastR" : 3 }
{ "_id" : ObjectId("5203a1b73c5438af60de63a0"), "value" : -100, "r" : [ { "v" : 4 }, { "v" : 1 }, { "v" : 10 } ], "lastR" : 10 }

与尝试使用聚合解决方案(结果集有 16MB 的限制,并且在需要处理投影时检索复杂文档变得更加复杂)相比,它将更加通用和可扩展。

关于mongodb - 如何使用数组的最后一个元素对集合进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18126094/

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