Mongo $ lookup для стороннего массива - PullRequest
0 голосов
/ 09 июля 2019

Фон

У меня 2 коллекции.У одного есть список _id, которые соответствуют другой коллекции.Например, коллекция Items имеет список Tag _ids (например, 10 тегов на элемент).

Многие теги могут иметь одинаковые имена.То, что я хочу, это список всех элементов, которые имеют tag._id в своем массиве, и эти tag._id получены через совпадение имени тега.Например, дайте мне все предметы, у которых есть tag._id в taglist, где 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)

Примечания

Я надеюсь позже разделить коллекцию Предметов, поэтому я не хочу опираться на запрос, который не является дружественным для шарда.

конечная цель этого запроса аналогична этому вопросу: Переслать ответ $ match из одной коллекции в другую $ match в Mongo

Но я хочу подойти к ответу под другим углом, потому что производительностьнекоторые из этих запросов были слишком медленными.

Этот подход:

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

Он работает, но невероятно медленно, потому что сначала он увеличивает коллекцию Предметов в 10 раз, а затем присоединяется кцелая коллекция тегов.Затем снова раскручивается и затем совпадает.

Я хочу сначала получить tag_id, а затем совпадение на основе этого.

ОБНОВЛЕНИЕ 1

Этот код является своего родаработает .. Я не знаю, как заставить его печатать хорошо или объединять буквы, как я хочу, но, похоже, это подход с возможным решением ...

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"}} } ])
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...