Mongodb聚合$lookup $project和$match不起作用[重复]
Posted
技术标签:
【中文标题】Mongodb聚合$lookup $project和$match不起作用[重复]【英文标题】:Mongodb aggregate $lookup $project and $match do not work [duplicate] 【发布时间】:2020-08-07 13:59:39 【问题描述】:我需要你的帮助。我在我的两个集合上使用过滤器练习非常简单的连接方法。它可以在没有过滤器的情况下工作。 下面提到了我的 mongodb 查询。
两个合集
第一次收藏
"_id": ObjectId("5ea18cd00715f152a6fcee24"),
"company_name": "COMPANY 1",
"company_detail_id": [
"_id": ObjectId("5e5db61dbb9d1523f7d78e65") //NOTE: company_detail_id == programs._id
],
"is_deleted": false,
第二次收藏
"_id": ObjectId("5e5db61dbb9d1523f7d78e65"),
"name": "PROGRAM 1",
"is_deleted": false
查询
var list = await dataModel.aggregate([ $lookup: from: "company_details", localField: "company_detail_id._id", foreignField: "_id", as: "programs" , "$project": "_id": true, "company_name": true, "company_detail_id": true, "is_deleted": true, "programs._id": true, "programs.name": true, "programs.is_deleted": true , "$match": "_id": "5ea18cd00715f152a6fcee24", "is_deleted":false ]).skip(0).limit(10);
问题
这个查询在什么时候起作用
"$match" :
or
"$match" : "company_name": "xyz"
这个查询不工作什么时候
"$match" : "_id" : "5ea18cd00715f152a6fcee24"
or
"$match" : "_id": "5ea18cd00715f152a6fcee24", "is_deleted":false
预期结果
"_id": "5ea18cd00715f152a6fcee24",
"company_name": "COMPANY 1",
"company_detail_id": [
"_id": "5e5db61dbb9d1523f7d78e65" //NOTE: company_detail_id == programs._id
],
"is_deleted": false,
"programs": [
"_id": "5e5db61dbb9d1523f7d78e65",
"name": "PROGRAM 1",
"is_deleted": false
]
【问题讨论】:
【参考方案1】:以 "_id" : "5ea18cd00715f152a6fcee24"
为部分的$match
阶段不起作用,因为它试图将ObjectId
与字符串匹配。
由于这里使用了 Mongoose,因此使用 mongoose.Types.ObjectId('5ea18cd00715f152a6fcee24')
将该字符串转换为有效的 mongodb ObjectId
。
查询:
var mongoose = require("mongoose");
var list = await dataModel
.aggregate([
$lookup:
from: "company_details",
localField: "company_detail_id._id",
foreignField: "_id",
as: "programs",
,
,
$project:
_id: true,
company_name: true,
company_detail_id: true,
is_deleted: true,
"programs._id": true,
"programs.name": true,
"programs.is_deleted": true,
,
,
$match:
_id: mongoose.Types.ObjectId("5ea18cd00715f152a6fcee24"),
is_deleted: false,
,
,
])
.skip(0)
.limit(10);
Playground Link
【讨论】:
是的,您在我编辑查询时发布了解决方案:)。还有一个建议:您没有使用单独的包mongodb
将字符串转换为objectId
。猫鼬就足够了。【参考方案2】:
我找到了解决方案
我包括
const ObjectId = require('mongodb');
然后在 $match 我使用
"$match" : "_id" : ObjectId("5ea18cd00715f152a6fcee24")
【讨论】:
以上是关于Mongodb聚合$lookup $project和$match不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB 聚合中的多个 $project 阶段是不是会影响性能