【问题标题】:MongoDB: sorted arraysMongoDB:排序数组
【发布时间】:2012-03-17 13:51:50
【问题描述】:

考虑以下 MongoDB 文档:

SomeObject {
    nested_objects_ids : [
        ObjectId( "1..." ), 
        ObjectId( "2..." ),
        ...
        ObjectId( "N..." )
    ]
}

nested_object_ids的长度没有限制。 是否有一种优雅的方法可以在推送任意值(即 ObjectIds)后保持nested_object_ids 数组的排序?

谢谢!

【问题讨论】:

  • 你按什么排序? ObjectId 本身?如果您希望它们按应该已经发生的插入顺序排序。
  • +1 这个问题,因为我也想知道是否有一个好的解决方案。据我所知,如果您希望它们按数字排序顺序,您实际上需要以排序形式写回($set)整个数组,而不是简单地使用 $push :anObjectId
  • @Russel,例如,首先插入一个 _id "45..." 的对象,下一个对象有 _id = "42..."。它将被插入到数组的末尾,但我想将它放在 id="45..." 的对象之前。
  • 我想我得到了什么你为什么要使用 ObjectIds 进行排序?它们不会按任何有意义的顺序排序。如果您使用 _id 字段的自定义值(例如递增 int)进行覆盖,则会失去 ObjectId 的很多好处,因此我会考虑重新审视您的设计。

标签: arrays mongodb sorting nosql


【解决方案1】:

有没有一种优雅的方法可以在推送任意值后保持nested_object_ids 数组的排序?

不幸的是,我认为没有什么是“优雅”的。

$push 命令在这里不起作用。您唯一的选择是将整个子数组拉入客户端,然后使用$set 重新编写它。

老实说,在处理“对象数组”时,MongoDB 的功能有限。您可以使用$push$pull 进行更新,并且可以在对象字段上建立索引,仅此而已。

很难更新特定的子对象。并且查询不会返回子对象,而是返回整个文档。您可以将其过滤为返回 nested_object_ids,但您总是会在那里获得整套。

问你一个问题:为什么需要对嵌套对象进行排序

【讨论】:

  • 非常感谢您的评论。考虑保存在这个数组中的 ObjectIds 来自不同的非同步源的情况,例如ObjectId_n
【解决方案2】:

您现在可以使用 $push to sorted array 功能执行此操作:https://jira.mongodb.org/browse/SERVER-8008

【讨论】:

  • 我想补充一点,SERVER-991 文档在$push 中提供了有关$sort 的更多信息。
  • 看起来您可以使用该功能请求中的$orderBy...但是我正在通过流星运行 mongo(所以 mongo 2.6),看起来我不能这样做... ?
【解决方案3】:

即将发布的 2.4 版本的 Mongodb 将允许排序 $push。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-16
    • 2013-03-01
    • 2019-05-07
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    相关资源
    最近更新 更多