Trước hết, nó là all_category_id
, không phải category_id
. Thứ hai, bạn không liên kết các bài báo - tất cả các tài liệu sẽ có cùng một article_category
mảng. Cuối cùng, bạn có thể muốn lọc ra các bài viết không có danh mục phù hợp. Đường dẫn có điều kiện sẽ trông giống như sau:
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
] }
} }
] )
CẬP NHẬT:
Nếu bạn không khớp với article_id
, $lookup
sẽ dẫn đến article_category
giống hệt nhau mảng cho tất cả các bài báo.
Giả sử article_category
của bạn bộ sưu tập có một tài liệu khác:
{
"article_id": 0,
"all_category_id": [5,8,10]
}
Với { $eq: [ "$article_id", "$$article_id" ] }
trong đường dẫn kết quả article_category
là
[
{
"article_id" : 2015110920343902,
"all_category_id" : [ 5, 8, 10 ]
}
]
không có:
[
{
"article_id" : 2015110920343902,
"all_category_id" : [ 5, 8, 10 ]
},
{
"article_id": 0,
"all_category_id": [ 5, 8, 10 ]
}
]
Nếu sau này là những gì bạn cần, sẽ đơn giản hơn để tìm kiếm các yêu cầu:
db.article.find({ title: { $regex: /example/ } })
và
db.article_category.find({ all_category_id: 8 })