首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数组在使用$lookup时被重新排序。

数组在使用$lookup时被重新排序。
EN

Stack Overflow用户
提问于 2021-05-05 07:34:33
回答 2查看 339关注 0票数 2

我有一个聚合:

代码语言:javascript
运行
复制
db.getCollection("users").aggregate([
  {
    "$match": {
      "_id": "5a708a38e6a4078bd49f01d5"
    }
  },
  {
    "$lookup": {
      "from": "user-locations",
      "localField": "locations",
      "as": "locations",
      "foreignField": "_id"
    }
  }
])

它工作得很好,但是有一件事我不明白,我也不能修复。在查询输出中,locations数组是由ObjectId重新排序的数组,我确实需要保持数据的原始顺序。

下面是来自locations集合的users数组的外观

代码语言:javascript
运行
复制
'locations' : [
     ObjectId("5b55e9820b720a1a7cd19633"), 
     ObjectId("5a708a38e6a4078bd49ef13f")
], 

以下是聚合之后的结果:

代码语言:javascript
运行
复制
'locations' : [
     {
        '_id' : ObjectId("5a708a38e6a4078bd49ef13f"),
        'name': 'Location 2'
     },
     {
        '_id' : ObjectId("5b55e9820b720a1a7cd19633"),
        'name': 'Location 1'
     }
],

我在这里错过了什么?我真的不知道如何处理这个问题。你能推我一下吗?

EN

Stack Overflow用户

回答已采纳

发布于 2021-05-05 09:08:26

$lookup不能保证结果文档的顺序,您可以尝试一种方法来管理文档的自然顺序,

  • $unwind解构locations数组并添加自动index号将从0开始,
  • 带位置的$lookup
  • $setlocations中选择第一个元素
  • $sortindex字段按升序排列
  • $group_idlocations阵列的重构
代码语言:javascript
运行
复制
db.users.aggregate([
  { $match: { _id: "5a708a38e6a4078bd49f01d5" } },
  {
    $unwind: {
      path: "$locations",
      includeArrayIndex: "index"
    }
  },
  {
    $lookup: {
      from: "user-locations",
      localField: "locations",
      foreignField: "_id",
      as: "locations"
    }
  },
  { $set: { locations: { $arrayElemAt: ["$locations", 0] } } },
  { $sort: { index: 1 } },
  {
    $group: {
      _id: "$_id",
      locations: { $push: "$locations" }
    }
  }
])

游乐场

票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67396937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档