Переслать ответ $ match из одной коллекции в $ match в Монго - PullRequest
2 голосов
/ 20 июня 2019

Фон

У меня есть коллекция монго теги :

...
{ "_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".Итак, я вывожу все item s, содержащие 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. Как получить, что этот массив элементов является _ids вывода первого $match

Ответы [ 2 ]

2 голосов
/ 20 июня 2019

Для объединения нескольких коллекций вы можете использовать $ lookup , но этап конвейера агрегации $lookup не будет работать напрямую с массивом.

Попробуйте следующий запрос:

db.items.aggregate([
  {$unwind : "$tags"},
  {$lookup : {
        "from" : "tags",
        "localField" : "tags",
        "foreignField" : "_id",
        "as" : "tagsObject"
      }
  },
  {$unwind : "$tagsObject"},
  {$match : {"tagsObject.tagkey" : "store"}} // To Filter out only the tag items. 
]);

Надеюсь, это поможет!

1 голос
/ 20 июня 2019

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