将$ match答案从一个集合转发到Mongo中的另一个$ match

时间:2019-06-20 19:25:15

标签: mongodb aggregation-framework

背景

我有一个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
)

更具体的问题

  1. 如何获得第二个$match来引用其他收藏集
  2. 如何获取该元素数组作为_id的输出 第一个$match

2 个答案:

答案 0 :(得分:2)

要加入多个集合,可以使用$lookup,但是chmod 777 \localpach\YOURDB.FDB 聚合管道阶段不能直接与数组一起使用。

尝试以下查询:

$lookup

希望这会有所帮助!

答案 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: []
            }
        }
    }
])