Фон
У меня 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"}} } ])
}