首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何调用子数组中另一个集合中的属性?

如何调用子数组中另一个集合中的属性?
EN

Stack Overflow用户
提问于 2020-11-27 05:45:00
回答 1查看 39关注 0票数 1

我有两个集合:一个叫做placestype_placesplace关联了一种place类型(type_places),这可以将其中的一些对象(objects数组)关联起来。

代码语言:javascript
复制
type_places
{
  "_id": "5fbc7cc705253c2da482023f",
  "type_place": "office",
  "objects": [
    {
      "_id": "5fbc7cc705253c2da48202saw",
      "name": "chair"
    },
    {
      "_id": "5fbc7cc705253c2da4820242",
      "name": "table"
    },
    {
      "_id": "5fbc7cc705253c2da482025f",
      "name": "desktop"
    }
  ]
}

places
{
    "_id": "5fbc7cc705253c2da482025f",
    "place": "Room 5",
    "type_place_id": "5fbc7cc705253c2da482023f", /*"office"*/
    "type_place_objects": [
      {
        "_id": "5fbc7cc705253c2da48202saw", /*chair*/
        "quantify": 4
      },
      {
        "_id": "5fbc7cc705253c2da482025f", /*desktop*/
        "quantify": 2
      }
    ]
  }

然后我希望当我查询一个place时,这个查询会显示我所咨询的place,它是什么样的地方(type_place),以及它有什么样的objects

期望的产出:

代码语言:javascript
复制
{
  "_id": "5fbc7cc705253c2da482023f",
  "place": "Room 5",
  "type_place_objects": [
    {
      "_id": "5fbc7cc705253c2da48202saw",
      "name": "chair",
      "quantify": 4
    },
    {
      "_id": "5fbc7cc705253c2da482025f",
      "name": "desktop",
      "quantify": 2
    }
  ]
}

我正在尝试,但不起作用:

代码语言:javascript
复制
place.aggregate(
[
  {
    "$match": {"place":"Room 5"}
  },

  {
    "$lookup": {
      "from": "type_place",
      "localField": "type_place_id",
      "foreignField": "_id",
      "as": "type_place_objects"
    }
  },
  {
    "$sort": {
      "_id": -1
    }
  },
  {
    "$project": {
      "_id":1,
      "place":1,
      "type_place_objects": 1
    }
  }
  
])

怎么才能修好呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-27 07:55:21

有很多种方法,其中一种方法是在您已经尝试过的情况下使用$lookup

代码语言:javascript
复制
db.place.aggregate([
  { "$match": { "place": "Room 5" } },
  { $unwind: "$type_place_objects"  },
  {
    "$lookup": {
      "from": "type_place",
      "let": { tpo: "$type_place_objects._id" },
      "pipeline": [
        { $unwind: "$objects" },
        {
          $match: {
            $expr: {
              $eq: [ "$objects._id", "$$tpo" ]
            }
          }
        }
      ],
      "as": "join"
    }
  },
  {
    $addFields: {
      "join": { "$arrayElemAt": [ "$join", 0]
      }
    }
  },
  {
    $addFields: { "type_place_objects.name": "$join.objects.name" }
  },
  {
    $group: {
      _id: "$_id",
      place: { $first: "$place" },
      type_place_objects: { "$addToSet": "$type_place_objects" }
    }
  }
])

Working 蒙戈游乐场

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65032621

复制
相关文章

相似问题

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