सबसे पहले, यह है 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 })