|
@@ -562,6 +562,8 @@ func (m *MongodbSim) Update(c string, q, u interface{}, upsert bool, multi bool)
|
|
}
|
|
}
|
|
return true
|
|
return true
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+//InsertOrUpdate 插入或更新
|
|
func (m *MongodbSim) InsertOrUpdate(db, collectionName string, data map[string]interface{}) error {
|
|
func (m *MongodbSim) InsertOrUpdate(db, collectionName string, data map[string]interface{}) error {
|
|
defer catch()
|
|
defer catch()
|
|
m.Open()
|
|
m.Open()
|
|
@@ -570,31 +572,39 @@ func (m *MongodbSim) InsertOrUpdate(db, collectionName string, data map[string]i
|
|
idValue, ok := data["_id"]
|
|
idValue, ok := data["_id"]
|
|
var idObj primitive.ObjectID
|
|
var idObj primitive.ObjectID
|
|
if ok {
|
|
if ok {
|
|
- if sid, ok := idValue.(string); ok {
|
|
|
|
- idValue, _ = primitive.ObjectIDFromHex(sid)
|
|
|
|
|
|
+ if oid, ok := idValue.(primitive.ObjectID); ok {
|
|
|
|
+ idObj = oid
|
|
|
|
+ } else if sid, ok := idValue.(string); ok {
|
|
|
|
+ idObj, _ = primitive.ObjectIDFromHex(sid)
|
|
}
|
|
}
|
|
- } else {
|
|
|
|
- // 如果 _id 不存在,则生成一个新的 ObjectID
|
|
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 如果 _id 不存在,则生成一个新的 ObjectID
|
|
|
|
+ if idObj.IsZero() {
|
|
idObj = primitive.NewObjectID()
|
|
idObj = primitive.NewObjectID()
|
|
- data["_id"] = idObj.Hex()
|
|
|
|
|
|
+ data["_id"] = idObj
|
|
}
|
|
}
|
|
|
|
|
|
- // 根据 _id 字段进行查找和更新,如果不存在则插入新数据
|
|
|
|
|
|
+ // 在插入新文档时检查 _id 是否已存在
|
|
filter := bson.M{"_id": idObj}
|
|
filter := bson.M{"_id": idObj}
|
|
- update := bson.M{"$set": data}
|
|
|
|
-
|
|
|
|
- // 尝试更新记录,如果记录不存在则插入新数据
|
|
|
|
- updateResult, err := m.C.Database(db).Collection(collectionName).UpdateOne(context.Background(), filter, update, options.Update().SetUpsert(true))
|
|
|
|
|
|
+ count, err := m.C.Database(db).Collection(collectionName).CountDocuments(context.Background(), filter)
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
|
|
- // 如果未修改任何文档,则表示需要插入新数据
|
|
|
|
- if updateResult.ModifiedCount == 0 {
|
|
|
|
|
|
+ // 如果 _id 不存在,则进行插入
|
|
|
|
+ if count == 0 {
|
|
_, err := m.C.Database(db).Collection(collectionName).InsertOne(context.Background(), data)
|
|
_, err := m.C.Database(db).Collection(collectionName).InsertOne(context.Background(), data)
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
+ } else {
|
|
|
|
+ // 如果 _id 已存在,则进行更新
|
|
|
|
+ update := bson.M{"$set": data}
|
|
|
|
+ _, err := m.C.Database(db).Collection(collectionName).UpdateOne(context.Background(), filter, update)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
return nil
|
|
return nil
|