Найти элементы массива, содержащие определенное значение

У меня есть такая схема:

{
    "_id" : ObjectId("55de668b4ac1fc9e75552db0"),
    "name" : "john",
    "documents" : {
        "number" : "125",
        "_clas" : "some class type here"
    }
}

Как я могу найти всех людей, у которых в качестве типа класса документов указана «плата»? Мне нужен вывод, например

john, 125
john, 456
Ann, 234
Ivan, 345

но элементы с _class = "qwe" не должны выводиться

Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
0
30
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если все, что вам нужно, это отфильтровать ваши документы с помощью _class как «платно», вы можете выполнить простой поисковый запрос,

db.collection.find({
  "documents._clas": "pay"
})

Если вы также хотите, чтобы ответ был структурирован так, как вы дали, вам придется использовать агрегацию.

db.collection.aggregate([
  {
    "$match": {
      "documents._clas": "pay"
    }
  },
  {
    "$project": {
      "name": 1,
      "product": "$documents._clas"
    }
  }
])

Этап $match находит документы, соответствующие требуемому запросу (_class как «pay»), а этап $project получает выходные данные в требуемом формате.

Обновлено: Если рассматривать документы как массив, решение будет таким:

db.collection.aggregate([
  {
    "$match": {
      "documents._clas": "pay"
    }
  },
  {
    "$project": {
      "name": 1,
      "product": {
        $filter: {
          input: "$documents",
          as: "document",
          cond: {
            $eq: [
              "$$document._clas",
              "pay"
            ]
          }
        }
      }
    }
  }
])

На этапе сопоставления получаются документы, для которых оплата является одним из элементов массива. Если вы считаете, что все документы в коллекции будут иметь хотя бы один _clas оплаты, то вы можете пропустить этот этап.

Нет, это не дает действительных результатов: <code>"_id" : "eb38cd12-1a5c-46ce-ad4c-e736d8cb0bf9", "name" : "john", "product" : [ "pay", "given", "given ", "pay", "help" ]<code> Но мне нужен только <code>"_id" : "eb38cd12-1a5c-46ce-ad4c-e736d8cb0bf9", "name" : "john", "product" : [ " платить", "платить" ]<код>

user3720167 29.01.2019 12:16

Является ли поле _clas массивом? Вы можете выложить некоторые документы из вашей коллекции и точный ответ, который вы ожидаете?

Elvis 29.01.2019 12:22

Ваш код возвращает документы, которые имеют хотя бы один элемент в массиве «documents», где «_clas»: «pay», и он также возвращает весь массив «documents», но мне нужно только, где «_clas» — «pay», а не все элементы

user3720167 29.01.2019 12:46

Итак, документы - это массив? В вопросе это объект

Elvis 29.01.2019 13:18

Да, это очень близко к хорошему ответу. Теперь я использую скрипт, очень похожий на ваш: [ {$project:{ internalNum:1, pay:{$size:{ $filter: { input: '$documents', as: 'item', cond: { $eq: [ ' $$item._class', 'DocumentPayment' ] } } }}, pay2:{ $filter: { input: '$documents', as: 'item', cond: { $eq: [ '$$item._class' , 'DocumentPayment' ] } } } }},{$match:{pay:{$gt:9}}},{ $project: {internalNum:1, pay2: 1 } } ] но как получить доступ к pay2[ 0].name или pay2[1].name? Мне нужны все поля pay2[].name

user3720167 29.01.2019 14:49

Большое спасибо! Я нашел решение

user3720167 29.01.2019 15:26

Другие вопросы по теме