Я просто хочу понять, что $ редактировать в mongodb Предположим, у меня есть коллекция вроде.
db.tab12.find()
{ "_id" : "1", "name" : "jan", "passport" : [ "usa" ] }
{ "_id" : "2", "name" : "jaan", "passport" : [ "usa", "canada" ] }
{ "_id" : "3", "name" : "jon", "passport" : [ "germany" ] }
и я запускаю следующую команду
db.tab12.aggregate({$match:{"name":{$regex:"a"}}},{$redact:{$cond:{if:{$in:["$country",["canada"]]},then:"$$DESCEND",else:"$$PRUNE" }} } )
Я не получаю результата, думаю, у mongodb нет примеров в сети.

Представим, что у вас есть коллекции ПК и События. Компьютер генерирует события другого типа, и вы хотите просто принимать события одного типа: 1
PC {
"_id": ObjectId,
"version": "SomeVersion",
"location": "Sofia",
"price": 220,
events: [1,2,3,4,5]
}
events{
"_id":1,
"type": 1,
"ts": "1999-01-01"
}
events{
"_id":2,
"securiy:" true,
"type": 2,
"ts": "2015-01-01"
}
PCs.aggregate([
{
$match: {
"location": "Sofia"
}
},
{
$unwind: {
path: '$events'
}
},
{
$project: {
events: '$pcs.events'
}
},
{
$unwind: {
path: '$events'
}
},
{
$lookup: {
from: 'events',
localField: 'event',
foreignField: '_id',
as: 'events'
}
},
{
$match: {
$and: [{
'events.ts': {
$gt: new Date("1970-01-01")
}
},
{
'events.ts': {
$lt: new Date("2000-02-02")
}
}
]
}
},
{
$redact: {
$cond: {
if: { $eq: [ '$events.type', 1 ] },
then: '$$KEEP',
else: '$$PRUNE'
}
}
},
это удалит все другие типы событий, которые не соответствуют условию. После этого шага вы можете выполнить некоторую группировку и, например, если у событий есть какие-то данные (например, цена), вы можете их суммировать.
{
$group: {
_id: {
isSecurityEvent: '$events.security',
},
totalEvents: { $sum: 1 },
}
}
}
])
Из документация mongo у вас есть 3 типа операторов:
System Variable Description
$$DESCEND $redact returns the fields at the current document level, excluding embedded documents. To include embedded documents and embedded documents within arrays, apply the $cond expression to the embedded documents to determine access for these embedded documents.
$$PRUNE $redact excludes all fields at this current document/embedded document level, without further inspection of any of the excluded fields. This applies even if the excluded field contains embedded documents that may have different access levels.
$$KEEP $redact returns or keeps all fields at this current document/embedded document level, without further inspection of the fields at this level. This applies even if the included field contains embedded documents that may have different access levels.
В документации есть примеры для учебника
$redactэтап и Редактирование на уровне поля. Предполагаемое использование этого этапа агрегирования - удаление встроенных документов на основе набора тегов доступа, определяющих видимость для пользователя. Образцы документов в вашем вопросе не являются правильной структурой или вариантом использования для$redact($filterбыл бы более подходящим для удаления значений массива).