MongoDB upsert массив документов с Голанг - PullRequest
0 голосов
/ 12 октября 2019

У меня есть документ, как показано ниже:

 {
       "_id": "1.0",
        files: [
          {"name": "file_1", "size": 1024, "create_ts": 1570862776426},
          {"name": "file_2", "size": 2048, "create_ts": 1570862778426}
        ]
    }

И я хочу добавить «файлы» с «file_x»: 1, если «file_x» уже находится в «файлах», затем обновить, например, «file_x»"is :

{"name": "file_2", "size": 4096, "create_ts": 1570862779426}

после того, как документ upsert :

{
   "_id": "1.0",
    files: [
      {"name": "file_1", "size": 1024, "create_ts": 1570862776426},
      {"name": "file_2", "size": 4096, "create_ts": 1570862779426}}
    ]
}

2, если" file_x "нет в" файлах ", вставьте его, например," file_x ": :

{"name": "file_3", "size": 4096, "create_ts": 1570862779426}

после того, как документ upsert:

{
   "_id": "1.0",
    files: [
      {"name": "file_1", "size": 1024, "create_ts": 1570862776426},
      {"name": "file_2", "size": 2048, "create_ts": 1570862778426},
      {"name": "file_3", "size": 4096, "create_ts": 1570862779426}
    ]
}

Так можно ли использовать одну функцию для его архивирования?

Ответы [ 2 ]

0 голосов
/ 13 октября 2019

Вам нужно будет сделать это вручную. Нет встроенного механизма для встроенных структур внутри документа.

Сначала выберите документ, проверьте, есть ли file_x в списке файлов, если нет, вставьте его. Затем сохраните документ обратно.

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

0 голосов
/ 12 октября 2019

На языке обновления mongodb нет ни одной операции обновления, которая бы выполняла то, что вы хотите. Вы можете приблизиться, используя $addToSet, который добавляет к набору элементов, если элемент еще не существует, но не обновляет элемент на основании совпадения подмножества полей. Лучше всего выполнить обновление для чтения в памяти и записи.

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