首页 > 解决方案 > 查找时数组引用的mongodb顺序

问题描述

我有两个收藏

collA{...}

collB
{
   ...
   data: [{type: ObjectId, ref: 'CollA'}],
}

当我使用查找来获取参考时,它看起来像下面这样完美,但数组的顺序发生了变化

{"$lookup": {
    "from": "collA",
    "localField": "data",
    "foreignField": "_id",
    "as": "data"
}},

在我的例子中,我有

collB {
   ...
   data [
      0: collA_0,
      1: collA_1
   ]
 }

但是当使用查找结果时

{
   ...
   data [
      0: collA_1,
      1: collA_0
   ]
 }

顺序被改变了。这是默认的查找吗?我怎样才能再次排序?

标签: node.jsmongodbmongoose

解决方案


是的,使用时$lookup,不保证返回文件的顺序。文档以“自然顺序”返回 - 正如它们在数据库中遇到的那样。获得保证一致顺序的唯一方法是$sort在查询中添加一个阶段。如果文档在您使用的 ODM 中排序,则可能是$sort在 ODM 本身中插入或排序对象。

参考:MongoDB Jira

您可以尝试使用此示例查询来对 MongoDB 3.6 及更高版本的输出进行排序。

查看此文档以获取更多信息Join Conditions and Subqueries on a Joined Collection

db.coll1.aggregate([
  {
    "$match": {
      _id: 1
    }
  },
  {
    "$lookup": {
      "from": "coll2",
      "localField": "data",
      "foreignField": "_id",
      let: {
        "data_id": "$data",
        
      },
      pipeline: [
        {
          "$addFields": {
            index: {
              $indexOfArray: [
                "$$data_id",
                "$_id"
              ]
            },
            
          }
        },
        {
          "$sort": {
            index: 1
          }
        },
        {
          "$project": {
            index: 0
          }
        }
      ],
      "as": "output"
    }
  }
])

这是测试查询Mongo Playground的游乐场链接


推荐阅读