Использование метода moon goose find () для запроса элементов в массивах - PullRequest
0 голосов
/ 02 февраля 2020

Вот как выглядит моя схема.

const CollectionSchema = new mongoose.Schema({
  since: Date,
  batch_id: Number,
  info: [InfoSchema],
  items: [ItemSchema]
});

const ItemSchema = new mongoose.Schema({
  name: String,
  price: Number,
  url: String
});

Я ищу Collection batch_id, Информация о коллекции, Цена товара, URL товара для определенного имени товара. Обратите внимание, что коллекция имеет массив элементов, и мы можем предположить, что имена элементов различны. Приведенный ниже запрос (я думаю) должен вернуть информацию о коллекции + batch_id для коллекций, в которых есть какой-либо элемент с именем 'le go'.

Collections.find(
  { "items.name": 'lego' },
  { info: 1, batch_id: 1 }
)
   .where("since")
   .gt(minutesAgo)

Я хотел бы включить цену элемента и URL элемента в ответе . Как бы я изменил вызов find (), чтобы вернуть эти данные? Опять же, добавление элементов: 1 добавит все элементы (но я ищу цену и URL только для соответствующего элемента).

Ответы [ 2 ]

0 голосов
/ 02 февраля 2020

Вы можете вернуть только выбранный элемент с помощью $ , но, к сожалению, в этом случае вы не можете выбрать, какие поля элемента возвращать (для этого вам потребуется использовать структуру агрегации):

Collections.find(
  { "items.name": "lego" },
  { info: 1, batch_id: 1, "items.$": 1 }
)

Приведенный выше запрос вернет только ПЕРВЫЙ соответствующий элемент, а не все.

0 голосов
/ 02 февраля 2020

Вы можете поместить items.price и items.url в запрос выбора, чтобы включить пропущенные поля.

Collections.find(
  { "items.name": 'lego' },
  { info: 1, batch_id: 1, "items.price": 1, "items.url": 1 }
)
   .where("since")
   .gt(minutesAgo)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...