mongodb findOneAndUpdate получить только обновленные поля - PullRequest
0 голосов
/ 16 сентября 2018

Я использую mongodb для вставки и обновления некоторых документов в некоторой коллекции. Когда я обновляю документ, я хочу получить только измененные поля. Я могу получить полностью новый документ (включая измененные поля), используя опцию returnOriginal для обновлений, но она дает мне все свойства.

Из документов :

returnOriginal | необязательно | При значении false возвращает обновленный документ а не оригинал. По умолчанию установлено значение

Мой код:

let result = await db.myCollection.findOneAndUpdate(
        {_id: ObjectId('5a2451399054bf000453c332')}, 
        data,
        {returnOriginal: true}
    );

, где data может быть либо одним полем, либо несколькими полями, например:

let data = {field1: 'newValue1'};

или

let data = {field1: 'newValue1', field2: 'newValue2'};

Я бы хотел получить только эти поля, но в результате обновления я получу весь объект, включая свойство _id и все остальные, даже если они не были изменены.

Я ищу простой способ (функция или свойство mongodb было бы идеальным) для получения только измененных полей , если есть такой способ, вместо сравнения обоих объектов (до и после).

Использование драйвера узла mongodb :

"mongodb": "^3.1.6"

1 Ответ

0 голосов
/ 16 сентября 2018

Вы можете сделать что-то вроде этого

Создайте пару значений ключа для передаваемых ключей со значением, равным 1, для использования в проекции.

var keys = {}
let data = { field1: 'newValue1', field2: 'newValue2' }
function setUsers(data) {
  for (var k in data) {
    if (data.hasOwnProperty(k)) {
      keys[k] = 1
    }
  }
  return keys
}
const projection = setUsers(data)

и затем использовать проекцию в запросе для ограничения полей

db.myCollection.findOneAndUpdate(
  { _id: ObjectId('5a2451399054bf000453c332') }, 
  data,
  { returnOriginal: true, projection }
)
...