javascript - 在聚合中的嵌入文档上使用 $match

标签 javascript node.js mongodb mongoose backend

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

我有一个名为 users 的文档,其中包含姓名、电子邮件等信息,并且还包含一个嵌入文档,其中包含该用户所从事的业务。

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

我还有一个名为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 }
      }
    }
  ]);

最佳答案

您需要匹配构建对象内的_id。尝试一下这个

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

如果不工作

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

操作编辑:我导入了 ObjectId:

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

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

关于javascript - 在聚合中的嵌入文档上使用 $match,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55611605/

相关文章:

javascript - 为什么 "this"不等于调用该函数的对象?

javascript - 在 HTML 中遍历 map

javascript - 如何在h2 innerhtml前后添加字符

mongodb - MongoDB 总存储大小

mongodb - 如何在mongodb中创建关系?

javascript - 使用javascript提供不同格式的音频文件

node.js - 如何使用 passport.js 身份验证从 facebook 获取个人资料数据?

node.js - 使用Node js将数据打印到热敏打印机

node.js - 无服务器:如何删除一个功能

c# - C# 中对 MongoDB 查询结果 (BsonDocuments) 的点表示法访问