Как получить значение текущего документа с помощью arrayElemAt в Mon go DB - PullRequest
1 голос
/ 14 апреля 2020

У меня есть пример данных

    instock:[ 
       { warehouse: "A", qty: 5 }, 
       { warehouse: "C" },
       { warehouse: "B",qty: 6 },
 ] }

В моем случае у меня есть три массива, я хочу получить instock.qty для индекса 1, который является нулевым, но я получаю значение 6 вместо значение NULL. пожалуйста, дайте мне знать, что я делаю не так здесь

это запрос, который я написал

db.foo.aggregate([
  { $project: { 

      qty: { $arrayElemAt: [ "$instock.qty", 1] }

      } }    
]);

Насколько я понимаю, в индексе 1 нет поля qty, поэтому пропускает индекс 1 и собирается на индекс 2. как преодолеть эту проблему.

1 Ответ

1 голос
/ 14 апреля 2020

На самом деле .dot синтаксис с оператором массива дает вам массив элементов. Вы можете проверить это здесь и, таким образом, вы получите второй первый элемент как 6.

Так что вместо этого вы можете найти 1-й элемент массива, затем можете использовать .dot синтаксис

db.collection.aggregate([
  { "$project": {
    "qty": { "$arrayElemAt": ["$instock", 1] }
  }},
  { "$project": {
    "qty": {
      "$ifNull": ["$qty.qty", null]
    }
  }}
])

MongoPlayground

...