【问题标题】:Mongodb sort by order of another arrayMongodb按另一个数组的顺序排序
【发布时间】:2020-01-09 21:47:56
【问题描述】:

我有几个相关的集合,我们称它们为父子集。

我的问题是我正在尝试按 child.name 字段对父文档进行排序。每个子文档也有一个 parentId 字段。

我创建了一个投影数组,它是子 _id 到名称的映射,并且按照我想要的排序顺序(按名称按字母顺序排列)。

子文件

 [
        {_id: "GiXtSJqg22aYf6h7r", name: "Allen"}
        {_id: "rRCiqcEAsDaDeJYL3", name: "Bob"}
        {_id: "bP2kKbsofyqKjp9Zq", name: "Chris"}
        {_id: "8so7KNeTwQGbLvwxo", name: "Darien"}
        {_id: "XZ7kMDSjae82ddi7p", name: "Edgar"}
        {_id: "k5j8LWTbWEStNhK5p", name: "Sally"}
]

然后我希望返回一些按 child.name 排序的父文档,如上所示。父母有一个childId,只是没有child.Name。所以我想我应该能够通过映射来解决这个问题。

有没有办法像下面这样..

Parents.find({}, { sort: {childId: ORDER_OF_MAPPING._id} }

所以排序顺序是“根据映射顺序升序”。

我希望在没有聚合的情况下执行此操作,因为我正在使用 Meteor Publish 方法返回我的光标。

有什么想法吗?

【问题讨论】:

  • 抱歉 - 我认为如果不进行聚合,它就不会成功...
  • 尼克,有没有关于如何使用聚合来做到这一点的指针?
  • 您的子对象是否在另一个集合中?在这种情况下,您应该首先研究如何在聚合语句中访问其他集合(我什至不知道这是否可能)。请在此处发布您的发现!谢谢!

标签: javascript mongodb sorting meteor


【解决方案1】:

解决这个问题的一种方法是使用herteby:denormalize 包到denormalize 你的数据库,如下所示:

ParentCollection.cache({
  type:'one',
  collection: ChildCollection,
  fields:['name'],
  referenceField:'childId',
  cacheField:'child'
})

然后(在运行使用非规范化字段更新数据库所需的数据迁移之后)您将能够对 child.name 键上的 ParentCollection 文档进行排序。

非规范化会影响写入操作,成本会更高(每次编辑子包时,包也会修改父包),但随后可以优化读取(更少的查询以达到相同的结果)。

此方法假设一个父级只有一个子级(即表之间是一对一的关系),这似乎与您在问题中描述的排序一致

另一个可以帮助你的非常强大的包是cultofcoders:grapher

【讨论】:

    猜你喜欢
    • 2022-12-16
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 2012-09-02
    • 2017-07-14
    • 2018-11-28
    相关资源
    最近更新 更多