聚合中对嵌入式文档使用$ match

时间:2019-04-10 11:37:44

标签: javascript node.js mongodb mongoose backend

我正在尝试使用$ match在双重嵌入式文档中查找具有特定_id的项目。

我有一个名为“用户”的文档,其中包含诸如姓名,电子邮件之类的信息,并且还包含一个嵌入式文档,其中包含该用户所从事的业务。

我还有一个名为“企业”的文档,其中包含一个嵌入式文档,其中包含该企业所在的建筑物。

我还有一个名为building的文档。

我正在尝试使用mongo查询,该查询返回具有特定建筑物ID的所有业务用户。

我有一个聚合函数,该函数使用$ lookup将用户与他们所在的建筑物进行匹配。但是,现在我试图使用$ match仅返回具有特定建筑物ID的文档。

以下是我的用户,业务和构建文档的示例:

_id: 5ca487c0eeedbe8ab59d7a7a
name: "John Smith"
email: "jsmith9@gmail.com"
business: Object
  _id: 5ca48481eeedbe8ab59d7a38
  name: "Visitors"


_id: 5ca48481eeedbe8ab59d7a38
name: "Visitors"
building: Object
  _id: 5ca48481eeedbe8ab59d7a36
  name: "Building1"


_id: 5ca48481eeedbe8ab59d7a36
name: "Building1"

当我返回聚合查询时,它将以以下格式返回文档:

    {
        "_id": "5ca487c0eeedbe8ab59d7a7a",
        "name": "John Smith",
        "email": "jsmith9@gmail.com",
        "business": {
            "_id": "5ca48481eeedbe8ab59d7a38",
            "name": "Visitors"
        },
        "__v": 0,
        "user_building": {
            "_id": "5ca48481eeedbe8ab59d7a38",
            "name": "Visitors",
            "building": {
                "_id": "5ca48481eeedbe8ab59d7a36",
                "name": "Building1"
            },
            "__v": 0
        }
    },

但是,当我添加匹配项时,它将返回[]。我在这里做错了什么?

router.get("/:id", async (req, res) => {
  const users_buildings = await User.aggregate([
    {
      $lookup: {
        from: "businesses",
        localField: "business._id",
        foreignField: "_id",
        as: "user_building"
      }
    },
    { $unwind: "$user_building" },

    {
      $match: {
        "user_building.building": { _id: req.params.id }
      }
    }
  ]);

1 个答案:

答案 0 :(得分:1)

您需要在建筑对象内匹配_id。试试这个

 {
  $match: {
    "user_building.building._id": req.params.id
  }
}

如果不起作用

{
  $match: {
    "user_building.building._id": ObjectId(req.params.id)
  }
}

操作编辑:我使用以下命令导入了ObjectId:

var ObjectId = require('mongodb').ObjectID;

并使用第二种解决方案,它可以正常工作。