Mongodb: согласен с существующим документом - PullRequest
1 голос
/ 11 февраля 2020

Моя коллекция выглядит следующим образом:

{
"_id" : "ID1234",
"read_object" : "sss-ssss",
"expireAt" : ISODate("2020-04-30T22:00:00.000Z")
}

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

db.collection.update(
{ _id: "ID1234" },
{
  $set: { read_object: { $concat: ["$read_object", "test"] } }, 
},
{ upsert: true }
)

, но каждый раз получаю сообщение об ошибке:

The dollar ($) prefixed field '$concat' in 'read_object.$concat' is not valid for storage.

Если я добавлю квадратные скобки перед $ set, например:

db.collection.update(
{ _id: "1b1b871493-14a0-4d21-bd74-086442df953c-2020-02" },
[{
  $set: { read_object: { $concat: ["$read_object", "test"] } }, 
}],
{ upsert: true }
)

Я получаю эту ошибку:

The dollar ($) prefixed field '$concat' in 'read_object.$concat' is not valid for storage.

Где у меня ошибка?

1 Ответ

0 голосов
/ 11 февраля 2020

$ concat является оператором агрегирования, то есть вы не можете использовать его при использовании синтаксиса basi c update, поскольку вы можете использовать только операторы обновления для него.

С учетом вышесказанного в Mon go версии 4.2 вводится обновлений конвейера , что в основном и заключается в том, что вы пытаетесь сделать с квадратными скобками.

Предполагается, что вы используете Mon go версии 4.2. Вот рабочий пример:

db.test1.update({_id: "ID1234"}, [
    {$set: {"read_object": {$concat: [{$ifNull: ["$read_object", ""]}, "test"]}}}
], {upsert: true});

По сути, нам просто нужно «заменить» read_object, если документ не существует, поскольку в этом случае он не определен.

Если вы используете Mon * Версия 1020 * меньше, чем 4.2, тогда, к сожалению, нет способа сделать то, что вы хотите, за одну операцию, вам придется сначала прочитать документ, а затем внести соответствующие изменения.

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