Массив редактирования MONGODB

Я просто хочу понять, что $ редактировать в 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 нет примеров в сети.

В документации есть примеры для учебника $redact этап и Редактирование на уровне поля. Предполагаемое использование этого этапа агрегирования - удаление встроенных документов на основе набора тегов доступа, определяющих видимость для пользователя. Образцы документов в вашем вопросе не являются правильной структурой или вариантом использования для $redact ($filter был бы более подходящим для удаления значений массива).

Stennie 15.04.2018 23:44
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
1
1
470
1

Ответы 1

Представим, что у вас есть коллекции ПК и События. Компьютер генерирует события другого типа, и вы хотите просто принимать события одного типа: 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.

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