Mongodb mongoose中带条件的查找
我有两个收藏。文章和书签 文章Mongodb mongoose中带条件的查找,mongodb,mongoose,aggregation-framework,Mongodb,Mongoose,Aggregation Framework,我有两个收藏。文章和书签 文章 { _id:“5FAA889AD5E0A6326A873D3”, 名称:“第1条” }, { _id:“5FAA889AD5E0A6326A873D”, 名称:“第2条” } 书签 { _id:“5FAA889AD5E0A6326A873D1”, 用户id:“5fc7b50da483a66a86aa7e9e”, 型号识别号:“5FAA889DE5E0A6326A873D3” } 我想加入带有书签的文章。如果用户将文章添加到书签中。 我试过的 const agg
{
_id:“5FAA889AD5E0A6326A873D3”,
名称:“第1条”
},
{
_id:“5FAA889AD5E0A6326A873D”,
名称:“第2条”
}
书签
{
_id:“5FAA889AD5E0A6326A873D1”,
用户id:“5fc7b50da483a66a86aa7e9e”,
型号识别号:“5FAA889DE5E0A6326A873D3”
}
我想加入带有书签的文章。如果用户将文章添加到书签中。
我试过的
const aggregate=wait Articles.aggregate([{
$lookup:{
来自:“类别”,
localField:“类别\u id”,
foreignField:“\u id”,
as:“类别识别码”
}
},
{
$lookup:{
来自:“书签”,
localField:“\u id”,
foreignField:“型号识别号”,
as:“书签”
}
}
]);
但它将为文章提供所有书签,而不仅仅是登录用户书签。那么我如何添加一个条件呢
{“user\u id”:objectId(req.user.\u id)}//记录的用户id
您可以从MongoDB v3.6开始使用
- 要将localField
作为\u id
变量传递,可以使用$$reference在查找管道中使用该字段model\u id
- 管道放置
阶段并匹配您所需的条件和$match
条件用户id
MongoDB v3.4的其他选项
- 迭代
,并根据条件得到过滤后的书签书签的循环
您可以在
$lookup
中嵌套管道
db.articles.aggregate([
{
$lookup: {
from: "bookmarks",
let: {
article_id: "$_id"
},
pipeline: [
{
$match: {
$expr: {
$and: [
{
$eq: [
"$model_id",
"$$article_id"
]
},
{
$eq: [
"$user_id",
"5fc7b50da483a66a86aa7e9a"
]
}
]
}
}
}
],
as: "bookmarks"
}
}
])
这里有一个正在工作的我收到错误MongoError:$lookup的参数必须是字符串,让:{model_id:$_id“}是objecttype你能确认你的mongodb版本吗?可能是3.6以下的mongodb版本,如果v3.6ok支持此功能,则可以使用此功能。是3.4。有没有其他选择我想没有你可以做过滤后,你的正常查找阶段,更新我的答案与该选项。让我们。
{
$lookup: {
from: "bookmarks",
localField: "_id",
foreignField: "model_id",
as: "bookmarks"
}
},
{
$addFields: {
bookmarks: {
$filter: {
input: "$bookmarks",
cond: { $eq: ["$$this.user_id", objectId(req.user._id)] }
}
}
}
}
db.articles.aggregate([
{
$lookup: {
from: "bookmarks",
let: {
article_id: "$_id"
},
pipeline: [
{
$match: {
$expr: {
$and: [
{
$eq: [
"$model_id",
"$$article_id"
]
},
{
$eq: [
"$user_id",
"5fc7b50da483a66a86aa7e9a"
]
}
]
}
}
}
],
as: "bookmarks"
}
}
])