背景
我有一个mongo收藏夹标签:
...
{ "_id" : 901, "tagkey" : "color", "tagvalue" : "black" }
{ "_id" : 902, "tagkey" : "color", "tagvalue" : "white" }
{ "_id" : 903, "tagkey" : "store", "tagvalue" : "supercenter" }
{ "_id" : 904, "tagkey" : "store", "tagvalue" : "gas station" }
...
和另一个收藏集项目:
...
{ "_id" : 12, "itemname" : "truck", "tags" : [901] }
{ "_id" : 13, "itemname" : "ink", "tags" : [901, 903] }
{ "_id" : 14, "itemname" : "paper", "tags" : [902, 903] }
{ "_id" : 14, "itemname" : "gas", "tags" : [904] }
...
我正在尝试询问商店中的所有对象。 这意味着我想要一个列表的所有商品,这些商品的标签都带有一个键名:“ store”。因此,我将在其标签列表中输出所有包含903或904的项目。 因此,我应该返回包含墨水,纸张和气体的列表。
问题
如何使用一个表的$match
的输出作为下一个查询的值?
我最接近的猜测
db.tags.aggregate (
{$match: {tagkey: "store"}}, # now I have a list of all the tag items
{$match: {tags: {$elemMatch: {$in :[****]} } }} ) #Here I need to run the match query on a different collection and match the tags element to one of the _ids from the first match
)
更具体的问题
$match
来引用其他收藏集$match
答案 0 :(得分:2)
答案 1 :(得分:1)
您可以使用$lookup with uncorrelated subqueries语法定义匹配条件,然后使用$ne运算符检查是否为每个项目分配了标签
db.items.aggregate([
{
$lookup: {
from: "tags",
let: { tags: "$tags" },
pipeline: [
{
$match: {
$expr: {
$and: [
{ $in: [ "$_id", "$$tags" ] },
{ $eq: [ "$tagkey", "store" ] }
]
}
}
}
],
as: "tagDetails"
}
},
{
$match: {
tagDetails: {
$ne: []
}
}
}
])