我有一个名为article_category
的集合,它存储了所有article_id
属于category_id
的类别,其数据格式如此。
收藏1:article_category
{
"article_id": 2015110920343902,
"all_category_id": [5,8,10]
}
然后我有另一个名为article
的集合,它存储了我的所有帖子
收藏2:文章
{
"title": "This is example rows in article collection"
"article_id": 2015110920343902,
},
{
"title": "Something change"
"article_id": 2015110920343903,
},
{
"title": "This is another rows",
"article_id": 2015110920343904,
}
现在我想执行MongoDB查询以查找title
regex
category_id
,而8
必须等于db.article.aggregate(
{
$match:
{
title:
{
$regex: /example/
}
}
},
{
$lookup:
{
from: "article_category",
pipeline: [
{ $match: { category_id: 8 } }
],
as: "article_category"
}
}
)
。这是我的查询,但不起作用。
regex
以上查询仅显示category_id
匹配但v-for
不匹配的记录。
有什么想法吗?
答案 0 :(得分:8)
首先,它是all_category_id
,而不是category_id
。其次,您没有链接文章 - 所有文档都将具有完全相同的article_category
数组。最后,您可能希望过滤掉那些没有匹配类别的文章。条件管道看起来应该更像这样:
db.article.aggregate([
{ $match: {
title: { $regex: /example/ }
} },
{ $lookup: {
from: "article_category",
let: {
article_id: "$article_id"
},
pipeline: [
{ $match: {
$expr: { $and: [
{ $in: [ 8, "$all_category_id" ] },
{ $eq: [ "$article_id", "$$article_id" ] }
] }
} }
],
as: "article_category"
} },
{ $match: {
$expr: { $gt: [
{ $size: "$article_category"},
0
] }
} }
] )
<强>更新强>
如果您不匹配article_id
,则$lookup
会在所有文章中生成相同的article_category
数组。
让我们说你的article_category
集合有另一份文件:
{
"article_id": 0,
"all_category_id": [5,8,10]
}
管道中{ $eq: [ "$article_id", "$$article_id" ] }
生成的article_category
为
[
{
"article_id" : 2015110920343902,
"all_category_id" : [ 5, 8, 10 ]
}
]
不
[
{
"article_id" : 2015110920343902,
"all_category_id" : [ 5, 8, 10 ]
},
{
"article_id": 0,
"all_category_id": [ 5, 8, 10 ]
}
]
如果您需要的是后者,那么查找请求会更简单:
db.article.find({ title: { $regex: /example/ } })
和
db.article_category.find({ all_category_id: 8 })
答案 1 :(得分:1)
这里有几件事不正确。 category_id
应为all_category_id
。使用$lookup
中的联接条件,并使用$match
$lookup
移动$unwind
以外的$project
进行optimized
查找。
使用排除的{$project:{article_category:0}}
从最终回复中删除查找字段。
像db.article.aggregate([
{"$match":{"title":{"$regex":/example/}}},
{"$lookup":{
"from":"article_category",
"localField":"article_id",
"foreignField":"article_id",
"as":"article_category"
}},
{"$unwind":"$article_category"},
{"$match":{"article_category.all_category_id":8}}
])
尝试
db.article.aggregate([
{"$match":{"title":{"$regex":/example/}}},
{"$lookup":{
"from":"article_category",
"pipeline":[{"$match":{"all_category_id":8}}],
"as":"categories"
}},
{"$match":{"categories":{"$ne":[]}}}
])
对于不相关的子查询,请尝试
{{1}}