У меня есть такая схема:
{
"_id" : ObjectId("55de668b4ac1fc9e75552db0"),
"name" : "john",
"documents" : {
"number" : "125",
"_clas" : "some class type here"
}
}
Как я могу найти всех людей, у которых в качестве типа класса документов указана «плата»? Мне нужен вывод, например
john, 125
john, 456
Ann, 234
Ivan, 345
но элементы с _class = "qwe" не должны выводиться



Если все, что вам нужно, это отфильтровать ваши документы с помощью _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 оплаты, то вы можете пропустить этот этап.
Является ли поле _clas массивом? Вы можете выложить некоторые документы из вашей коллекции и точный ответ, который вы ожидаете?
Ваш код возвращает документы, которые имеют хотя бы один элемент в массиве «documents», где «_clas»: «pay», и он также возвращает весь массив «documents», но мне нужно только, где «_clas» — «pay», а не все элементы
Итак, документы - это массив? В вопросе это объект
Да, это очень близко к хорошему ответу. Теперь я использую скрипт, очень похожий на ваш: [ {$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
Большое спасибо! Я нашел решение
Нет, это не дает действительных результатов: <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" : [ " платить", "платить" ]<код>