在聚合中的嵌入式文档上使用 $match
Using $match on an embedded document in an aggregate
我正在尝试使用 $match 在双重嵌入文档中查找具有特定 _id 的项目。
我有一个名为 users 的文档,其中包含姓名、电子邮件等信息,它还包含一个嵌入式文档,其中包含与该用户相关的业务。
我还有一个名为 businesses 的文档,其中包含一个嵌入文档,其中包含该商家所在的建筑物。
我也有一个文件叫做building。
我正在尝试进行 mongo 查询,其中 return 在某个建筑物 ID 开展业务的所有用户。
我有一个聚合函数,它使用 $lookup 将用户与他们所在的建筑物相匹配。这确实有效。但是现在我正在尝试使用 $match 来仅 return 具有特定建筑 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"
当我 return 聚合查询时,它 return 的文档格式如下:
{
"_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
}
},
然而,当我添加匹配项时,它 returns []。我在这里做错了什么?
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)
}
}
op 编辑:我导入了 ObjectId:
var ObjectId = require('mongodb').ObjectID;
并使用了第二种解决方案,它工作正常。
我正在尝试使用 $match 在双重嵌入文档中查找具有特定 _id 的项目。
我有一个名为 users 的文档,其中包含姓名、电子邮件等信息,它还包含一个嵌入式文档,其中包含与该用户相关的业务。
我还有一个名为 businesses 的文档,其中包含一个嵌入文档,其中包含该商家所在的建筑物。
我也有一个文件叫做building。
我正在尝试进行 mongo 查询,其中 return 在某个建筑物 ID 开展业务的所有用户。
我有一个聚合函数,它使用 $lookup 将用户与他们所在的建筑物相匹配。这确实有效。但是现在我正在尝试使用 $match 来仅 return 具有特定建筑 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"
当我 return 聚合查询时,它 return 的文档格式如下:
{
"_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
}
},
然而,当我添加匹配项时,它 returns []。我在这里做错了什么?
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)
}
}
op 编辑:我导入了 ObjectId:
var ObjectId = require('mongodb').ObjectID;
并使用了第二种解决方案,它工作正常。