MongoDB изменить поток отображения только выбранные поля

Я пытаюсь понять поток изменений в MongoDB.

Я пытаюсь отобразить только некоторые поля обновленного документа.

Так я и сделал:

option={ 'full_document':'updateLookup' }
collection.watch([{"$match"  : { "operationType" : "update" }}] , **option)

который работает.

Теперь я хочу отобразить только некоторые поля.

Я старался:

collection.watch([{"$match"  : { "operationType" : "update" }},{"$project":{"_id":1}}] , **option)

или же

collection.watch([{"$match"  : { "operationType" : "update" }}],option).aggregate({"$project":{"_id":1}})

но ни один из них не работает.

Как я могу отображать только выбранные поля?

1 ответ

Решение

Со страницы документации по событию изменения поток изменений выведет этот документ:

{
   _id : { <BSON Object> },
   "operationType" : "<operation>",
   "fullDocument" : { <document> },
   "ns" : {
      "db" : "<database>",
      "coll" : "<collection"
   },
   "documentKey" : { "_id" : <ObjectId> },
   "updateDescription" : {
      "updatedFields" : { <document> },
      "removedFields" : [ "<field>", ... ]
   }
}

То есть этот документ будет выходным, если вы ничего не поместите в watch() метод.

Затем вы можете использовать этапы конвейера агрегации для фильтрации / изменения этого документа.

Например, если вы хотите видеть только поля _id, a, а также b из вставленных / обновленных документов конвейер будет (с использованием Python):

with db.test.watch([
    {'$project': {
        'fullDocument_id':'$fullDocument._id',
        'a':'$fullDocument.a',
        'b':'$fullDocument.b'}}], full_document='updateLookup') as stream:
    for change in stream:
        print change

Вставьте данные в MongoDB:

> db.test.insert({a:1, b:1, c:1, d:1})

Поток изменений выведет:

{'a': 1.0,
 'fullDocument_id': ObjectId('5aa0c2300551e941c6958f86'),
 '_id': <BSON object>,
 'b': 1.0}

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

Примечание: я также использовал параметр full_document='updateLookup' при создании потока. В противном случае полный документ не будет показан в update событие. Это объясняется на странице изменения события

Примечание. Приведенный выше пример предназначен для вставки документов, но вы можете легко настроить его для обновлений, используя $match: {operationType: 'update'} этап перед $project этап.

Примечание: fullDocument поле, возвращаемое при событиях обновления, содержит искомую версию документа, принятую большинством для членов набора реплик. Это может быть или не быть версия документа, которая была изменена. Любые другие операции перемежения между операцией обновления и когда поток изменений возвращается клиенту, могли изменить версию документа. Например, событие удаления может вызвать fullDocument поле быть null, См. Поиск полного документа для операций обновления для получения дополнительной информации.

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