外部数组上的Mongo $ lookup

时间:2019-07-09 18:01:43

标签: mongodb aggregation-framework

背景

我有2个收藏集。一个具有与另一个集合相对应的_id的列表。例如, Items 集合具有一个 Tag _ids列表(例如每个项10个标记)。

许多标签可以具有相同的名称。我想要的是一个数组中所有具有tag._id的项目的列表,并且这些tag._id是通过标记名称匹配获得的。例如,给我所有在taglist中具有tag._id的商品,其中tag._id对应于名称为“ Store”的标签

问题

如何将外部集合的数组与本地集合的_id $匹配?

我到目前为止所拥有的

db.mytags.aggregate([
   {$match: {"tagkey": "Store"}},
   {$lookup: {"from": "items", "localField": "_id", "foreignField": "taglist", as:"Item"}}
])

我有这个查询,因为taglist是一个数组,所以不起作用。

首场比赛后,我有一个这样的列表:

{ "_id" : 500, "tagkey" : "Store", "tagvalue" : "tagValue500" }
{ "_id" : 681, "tagkey" : "Store", "tagvalue" : "tagValue681" }
{ "_id" : 5500, "tagkey" : "Store", "tagvalue" : "tagValue500" }
{ "_id" : 5681, "tagkey" : "Store", "tagvalue" : "tagValue681" }

在这之后,我要做的是db.items.find({taglist: _id}),它被调用4次,每个_id(500,681,5500,5681)一次

注释

我希望以后再对Items集合进行分片,所以我不希望依赖于不对分片友好的查询。

此查询的最终目标类似于以下问题:Forward $match answer from one collection to another $match in Mongo

但是我想从另一个角度来回答这个问题,因为其中一些查询的性能太慢了。

这种方法:

db.items.aggregate([
    {$unwind: "$taglist"},
    {$lookup: {"from": "mytags", "localField": "tagist", "foreignField": "_id", as: "TagDetails" }},
    {$unwind: "$TagDetails"},
    {$match: {"TagDetails.tagkey": "Store"}
])

它可以工作,但是却非常慢,因为它首先使Items集合变大了10倍,然后又加入了整个标签集合。然后再次放松,然后进行匹配。

我想先获取tag_id,然后根据其进行匹配。

更新1

这段代码有点奏效。.我不知道如何使其打印得好或像我想要的那样合并j,但这似乎是一种可能的解决方法...

var mycursor = db.uct_tags.find({"tagkey":"Store"})
while (!mycursor.isExhausted()) {
    var g = mycursor.next()._id
    var k = db.items.find({"taglist":g}).count()
    var j = db.items.aggregate([{$match: {"taglist": g} },{$group: { _id: null, cost: { $sum : "$cost"}} } ])
}

0 个答案:

没有答案
相关问题