3 回答

TA貢獻1936條經驗 獲得超7個贊
根據之前在 SO 中的問題,例如這個和另一個,似乎不可能upserts僅使用$in運算符執行多個,因為它只會插入一個文檔(與過濾器匹配的那個):
如果沒有文檔與查詢條件匹配,則 db.collection.update() 插入單個文檔。
因此,正如@Kartavya 所提到的,最好的方法是使用BulkWrite.
為此,您需要為每個用戶附加一個 upsert 操作(= WriteModel)tokens作為過濾器,并且您可以使用相同的$addToSet更新操作:
tokens := [...]string{"userId1", "userId3"}
newRef := "refXXXXXXX"
// all docs can use the same $addToSet update operation
updateOp := bson.D{{"$addToSet", bson.D{{"refs", newRef}}}}
// we'll append one update for each userId in tokens as a filter
upserts := []mongo.WriteModel{}
for _, t := range tokens {
upserts = append(
upserts,
mongo.NewUpdateOneModel().SetFilter(bson.D{{"userId", t}}).SetUpdate(updateOp).SetUpsert(true))
}
opts := options.BulkWrite().SetOrdered(false)
res, err := col.BulkWrite(context.TODO(), upserts, opts)
if err != nil {
log.Fatal(err)
}
fmt.Println(res)

TA貢獻1111條經驗 獲得超0個贊
查看您的用例,我認為最好的解決方案如下:
由于您的規模很大并且希望進行批量請求,因此最好使用 BulkWrite : db.collection.bulkWrite() 方法提供了執行批量插入、更新和刪除操作的能力。示例:https ://godoc.org/go.mongodb.org/mongo-driver/mongo#example-Collection-BulkWrite
這使用 UpdateOne 模型,但它也支持 UpdateMany 模型。它也是 SetUpsert(true) 的一個功能 現在對于 _id 字段:您更新/更新的文檔應該具有 _id 字段,以便新文檔具有該 _id 字段,否則 mongoDb 會在插入文檔時自動生成一個 _id 字段,如果您的 upsert 文檔有沒有 _id 字段
我認為,在您的文檔中包含 _id 字段不會很痛苦,這樣您的問題就解決了。
關于規模,我建議將 BulkWrite 與 UpdateOne 或 UpdateMany 模型一起使用。
- 3 回答
- 0 關注
- 130 瀏覽
添加回答
舉報