Mongodb updateone с $ set и $ currentDate выдает код ошибки 40 после второго обновления - PullRequest
0 голосов
/ 08 сентября 2018

Я использую node и mongodb, и я хочу обновить документ и добавить дату изменения. У меня проблема при обновлении во второй раз. Конкретный случай сбоя во второй раз заключается в следующем:

  • документ уже существует, но не имеет поля 'lastModified'.
  • При первой модификации поле 'lastModified' добавляется с правильным значением.
  • вторая модификация должна обновить поле 'lastModified' с текущей датой, но не может.

Показана ошибка:

{"driver": true, "name": "MongoError", "index": 0, "code": 40, "errmsg": "Обновление пути 'lastModified' приведет к конфликту в 'lastModified'" }, "Титулы": нулевая}}

документ на монго:

{
    _id" : ObjectId("5af07316fc5f13c574ba825b"),
    "field1" : "value1"
}

мой код для обновления:

const MongoClient = require('mongodb').MongoClient;
const assert = require('assert');

let url = 'some mongo url';
let database = 'some database';
let newData = {'field1':'newValue1'}

(async function() {
    let client;
    try {
        client = await MongoClient.connect(url , {useNewUrlParser: true});
        let database = client.db(database);
        let result = await database.collection(collection).updateOne(filter, {
                $set: newData,
                $currentDate: {'lastModified': true}
            });

        assert.equal(1, result.matchedCount);
        assert.equal(1, result.modifiedCount);

        // Close connection
        client.close();
    } catch (err) {
        console.log(err.stack);
    }

    // Close connection
    client.close();
})();

После первого обновления документ в БД:

{
    _id" : ObjectId("5af07316fc5f13c574ba825b"),
    "field1" : "value1",
    "lastModified" : ISODate("2018-09-07T23:18:21.485Z")
}

Что правильно. Во второй раз, когда я пытаюсь обновить, это не удается.

Я использую:

"mongodb": "^3.1.4",
"node": "^10.10.0",

Есть предложения, что может быть не так?

Edit:

После первого обновления данные берутся из базы данных, а затем выполняется второе обновление.

1 Ответ

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

Ошибка выдается, потому что объект в $ set содержит свойство, которое также будет установлено $ currentDate.Решение состоит в том, чтобы убедиться, что свойство не существует в newData, если оно будет установлено любым оператором обновления .

. В этом случае перед обновлением очистите newData и убедитесь, чтоу него нет свойства lastModified, так как он будет изменен оператором обновления $ currentDate:

...
// remove any property that will be used by update operators
if (newData && newData.hasOwnProperty('lastModified')) {
    delete newData['lastModified'];
}

let result = await database.collection(collection).updateOne(filter, {
            $set: newData,
            $currentDate: {'lastModified': true}
        });
...

Mongodb Код ошибки 40

Код ошибки 40 относитсяв 'ConflictingUpdateOperators', который является конфликтом свойства в операторе обновления.В этом случае он конфликтует с другим свойством в наборе $, поэтому, если это случится с кем-либо, проверьте, что вы не обновляете одно и то же свойство дважды в одной и той же команде.

Доступен полный Mongodb Error Code List Listздесь но, по-видимому, нет официальной документации по описанию или проблемам с этими кодами (очевидно, было удалено с помощью this commit ).

Это решило проблему.спасибо @Greg за указание правильного направления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...