背景
我有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"}} } ])
}