Nano Hash - криптовалюты, майнинг, программирование

Агрегация MongoDB проецирует определенные поля из поиска

Этот пример следует за https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/#use-lookup-with-mergeobjects

db.orders.insert([
   { "_id" : 1, "item" : "almonds", "price" : 12, "quantity" : 2 },
   { "_id" : 2, "item" : "pecans", "price" : 20, "quantity" : 1 }
])

db.items.insert([
  { "_id" : 1, "item" : "almonds", description: "almond clusters", "instock" : 120 },
  { "_id" : 2, "item" : "bread", description: "raisin and nut bread", "instock" : 80 },
  { "_id" : 3, "item" : "pecans", description: "candied pecans", "instock" : 60 }
])

Агрегация:

db.orders.aggregate([
   {
      $lookup: {
         from: "items",
         localField: "item",    // field in the orders collection
         foreignField: "item",  // field in the items collection
         as: "fromItems"
      }
   },
   {
      $replaceRoot: { newRoot: { $mergeObjects: [ { $arrayElemAt: [ "$fromItems", 0 ] }, "$$ROOT" ] } }
   },
   { $project: { fromItems: 0 } }
])

Результат:

{ "_id" : 1, "item" : "almonds", "description" : "almond clusters", "instock" : 120, "price" : 12, "quantity" : 2 }
{ "_id" : 2, "item" : "pecans", "description" : "candied pecans", "instock" : 60, "price" : 20, "quantity" : 1 }

Вопрос: Как изменить агрегацию для проецирования определенных полей? например только проект _id, элемент и описание:

{ "_id" : 1, "item" : "almonds", "description" : "almond clusters" }
{ "_id" : 2, "item" : "pecans", "description" : "candied pecans" }

  • То, что вы сделали, правильно, mongoplayground.net/p/qhpWsmPKwVl. Просто нужно спроецировать нужные поля Только 23.11.2020
  • @varman Спасибо, и на самом деле моя ситуация такова, mongoplayground.net/p/T96ijiGvZb5, я использую orders.itemId для ссылки на items._id, и я не могу проецировать описание. 23.11.2020
  • Проблема в том, что ваша строка itemId si в коллекции заказов, в то время как _id - это номер в коллекции товаров. То, что дал вам @minsky, является правильным ответом. 23.11.2020

Ответы:


1

Вы получаете пустой массив, потому что $lookup что-то ловит.

  • соответствовать типам
  • $addFields конвертировать

ПЛОЩАДКА

Это должен быть первый этап:

      {
        $addFields: {
          itemId: {
            $convert: {
              input: "$itemId",
              to: "int"
            }
          }
        }
      },

Если вы предпочитаете, нет необходимости добавлять этап

  • Вы также можете удалить addFields и использовать $lookup+let.

Измените поиск таким образом:

 {
    $lookup: {
      from: "items",
      let: {
        itemId: {
          $convert: {
            input: "$itemId",
            to: "int"
          }
        }
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $eq: [
                "$_id",
                "$$itemId"
              ]
            }
          }
        }
      ],
      /** field in the items collection*/
      as: "fromItems"
    }
  }

PLAYGROUND2

23.11.2020
Новые материалы

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

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..