Использование FindAndModify для запуска запросов в официальном драйвере Mongo Go - PullRequest
1 голос
/ 17 апреля 2019

В управляемом сообществом драйвере Mongo для Go, то есть Mgo, мы можем использовать вызов API Apply для запуска запросов MongoDB, включающих $set или $inc. Пример этого варианта использования в Mgo следующий:

change := mgo.Change{
    Update:    bson.M{"$set": bson.M{"phone": "+55 53 8402 8510"}},
    ReturnNew: true,
}
_, err = MongoSession.DB("test").C("people").Find(bson.M{"_id": a}).Apply(change, &result)

Цитирование официальной документации для этого вызова API:

Apply запускает команду findAndModify MongoDB, которая позволяет обновлять, добавление или удаление документа, соответствующего запросу и атомарно возвращая либо старую версию (по умолчанию), либо новую версию документ (когда ReturnNew имеет значение true).

В настоящее время я работаю над переносом проекта с Mgo на официальный драйвер Mongo Go . Однако я не могу найти какой-либо метод, который запускает команду findAndModify для достижения аналогичного варианта использования. Для замены API Apply соответствующим методом из официального драйвера, какой подход рекомендуется?

Я рассмотрел запрос в разделе «Обновление» в существующем коде и вручную, используя методы поиска / обновления / замены, предоставленные в официальном драйвере. Но есть ли лучший способ сделать то же самое?

1 Ответ

1 голос
/ 17 апреля 2019

Мне удалось решить эту проблему с помощью API FindOneAndUpdate .

Он внутренне использует FindAndModify, хотя это явно не упоминается в документации.Код, который я использовал для эмуляции этой функции Mgo в драйвере Mongo Go, выглядит следующим образом:

MongoSession, err := mongo.NewClient(options.Client().ApplyURI("mongodb://localhost:27017"))
if err != nil {
    panic(err)
}
ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
err = MongoSession.Connect(ctx)
collection := MongoSession.Database("test").Collection("people")
a, err := primitive.ObjectIDFromHex("XXXXXXXXXX") //hiding hex value
b := collection.FindOneAndUpdate(ctx, bson.M{"_id": a}, bson.M{"$set": bson.M{"phone": "Replacing using the query"}})
...