Как вставить документ, если фильтр ничего не возвращает, в противном случае заменить документ, найденный в mongodb, на go? - PullRequest
0 голосов
/ 23 апреля 2020

Я не использую пакет M GO, как в этом примере, просто активное репо из здесь .

У меня трудное время для чтения документация . По сути, у меня есть объект bson.M, который я хочу заменить текущим, и, если этот объект не существует, вставьте его.

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

updateFilter := bson.D{{"from_symbol", fromSymbol}, {"to_symbol", strings.ToUpper(currency["to_symbol"].(string))}}
// The above seems to be correctly finding the documents I want
// currency is my bson.M object

_, err := collection.ReplaceOne(ctx, updateFilter, currency)
// However this line will not additionally insert if the object is not found, it is replacing fine

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


РЕДАКТИРОВАТЬ:

Похоже, должен быть способ сделать что-то с replaceOptions, см. Документацию .

upsert := options.ReplaceOptions{Upsert: true}
_, err := collection.ReplaceOne(ctx, updateFilter, currency, upset)

Однако это дает мне ошибку:

cannot use true (type bool) as type *bool in field value

1 Ответ

1 голос
/ 23 апреля 2020

Используйте функцию SetUpsert:

collection.ReplaceOne(ctx,filter,newDoc,options.Replace().SetUpsert(true))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...