Как сопоставить 2 поля в коллекции Mon go с одним из полей внутри массива - PullRequest
0 голосов
/ 16 июня 2020

У меня есть коллекция Items объектов, например:

[{"Item" : "Apple",
  "Company" : "American Foods",
  "Items" : [{"name" : "Banana", "name" : "Orange", "name" : "Apple", "name" : "Avocado"}]},
 {"Item" : "Mango",
  "Company" : "American Foods",
  "Items" : [{"name" : "Banana", "name" : "Orange", "name" : "Apple", "name" : "Avocado"}]},
 {"Item" : "Banana",
  "Company" : "Indian Foods",
  "Items" : [{"name" : "Banana", "name" : "Orange", "name" : "Apple", "name" : "Avocado"}]}
]

Я хочу написать сводный запрос mon go, который принимает входные данные для возврата всех документов, соответствующих любому Item = Items[i].name И Company = input.

Предположим, что если я буду искать с input = American Foods, то запрос вернет 1 документ из коллекции (поскольку Man go отсутствует в Items, а компания Banana - Indian Foods):

{"Item" : "Apple",
  "Company" : "American Foods",
  "Items" : [{"name" : "Banana", "name" : "Orange", "name" : "Apple", "name" : "Avocado"}]}

Ответы [ 2 ]

1 голос
/ 16 июня 2020

Вам необходимо использовать оператор $expr:

db.collection.aggregate([
  {
    $match: {
      $expr: {
        $and: [
          {
            $eq: [ "$Company", "American Foods"]
          },
          {
            $in: [ "$Item", "$Items.name" ]
          }
        ]
      }
    }
  }
])

MongoPlayground

Примечание: Ваш массив Items неверен JSON синтаксис, в нем должны быть отдельные элементы

1 голос
/ 16 июня 2020

Nodejs + пн goose

А можно так попробовать?

var input = "American Foods";
Items.find({},function(err, list_items){
    if(err){
        console.log("err: " + err);
    }else{
        if(list_items.length > 0){
            list_items.forEach(item_tmp => {
                Items.find( { Company : input,"Items": { name:  item_tmp.Item} }, function(err, data){
                    // doing something
                } )
            })
        }
    }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...