我有一个称为的集合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
。
任何的想法?
首先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 })
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句