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

Mongodb 如何调用子数组中另一个集合中的属性?,mongodb,Mongodb,我有两个收藏:一个叫做places和type\u places。一个place关联了一种类型的place(type\u places),这可以关联这个(objects数组)中的一些对象 然后我想当我查询一个地方时,查询会向我显示被咨询的地方,它是什么样的地方(type\u place),以及它有什么对象 所需输出: { "_id": "5fbc7cc705253c2da482023f", "place": "Room

我有两个收藏:一个叫做
places
type\u places
。一个
place
关联了一种类型的place(
type\u places
),这可以关联这个(
objects
数组)中的一些对象

然后我想当我查询一个
地方
时,查询会向我显示被咨询的
地方
,它是什么样的地方(
type\u place
),以及它有什么
对象

所需输出:

{
  "_id": "5fbc7cc705253c2da482023f",
  "place": "Room 5",
  "type_place_objects": [
    {
      "_id": "5fbc7cc705253c2da48202saw",
      "name": "chair",
      "quantify": 4
    },
    {
      "_id": "5fbc7cc705253c2da482025f",
      "name": "desktop",
      "quantify": 2
    }
  ]
}
我正在尝试,但不起作用:

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
    }
  }
  
])

如何修复它?

有很多方法,其中一种方法是使用
$lookup
,就像您已经尝试过的那样

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" }
    }
  }
])

工作

你能给我解释一下这句话吗:
加入:{“$arrayElemAt”:[“$join”,0]
当我们加入(查找)时,它会给你一个数组。使用$arrayElemAt,我得到第一个对象。Thanks genious,如果你有空闲时间,如果你能帮助我,我将不胜感激。我是基于你以前的回答@yavg抱歉,回复太晚了。有点忙。已经回复了
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" }
    }
  }
])