Golang Mongodb $push 如果不存在则创建
Golang Mongodb $push and if doesn't exist create
所以基本上我有一个必须出现在 mongoDb 中的结构,我必须编写一个查询 将首先检查具有 profileID 的对象是否已经存在,它将推送一个新的报价id 到现有对象提供数组。如果不存在具有 profileID 的对象,它将创建一个并将报价 ID 添加到报价数组。是否可以在一个查询中完成?如果可以,有人可以帮助我实现它吗?
type IgnoreOffer struct {
ProfileID primitive.ObjectID `json:"profileID" bson:"profileID"`
Offers []primitive.ObjectID `json:"offers,omitempty" bson:"offers,omitempty"`
}
这是我的代码,但它不会在数据库中创建新对象。
func getIgnoreOffersCollection() *mongo.Collection {
return db.GetMongoCollection("ignoreOffers")
}
func ignoreOffer(profileId primitive.ObjectID, offerId primitive.ObjectID) error {
var offer IgnoreOffer
offer.ProfileID = profileId
ctx, _ := db.GetTimeoutContext()
filter := bson.M{"profileID": profileId}
update := bson.M{
"$set": bson.M{
"updatedAt": time.Now(),
},
"$push": bson.M{
"offers": offerId,
},
}
_, err := getIgnoreOffersCollection().UpdateOne(ctx, filter, update)
if err != nil {
log.Error("could not update ignoreOffer collection, err: ", err)
return err
}
return nil
}
您的情况需要更新插入:
_, err := getIgnoreOffersCollection().UpdateOne(ctx, filter, update, options.Update().SetUpsert(true))
所以基本上我有一个必须出现在 mongoDb 中的结构,我必须编写一个查询 将首先检查具有 profileID 的对象是否已经存在,它将推送一个新的报价id 到现有对象提供数组。如果不存在具有 profileID 的对象,它将创建一个并将报价 ID 添加到报价数组。是否可以在一个查询中完成?如果可以,有人可以帮助我实现它吗?
type IgnoreOffer struct {
ProfileID primitive.ObjectID `json:"profileID" bson:"profileID"`
Offers []primitive.ObjectID `json:"offers,omitempty" bson:"offers,omitempty"`
}
这是我的代码,但它不会在数据库中创建新对象。
func getIgnoreOffersCollection() *mongo.Collection {
return db.GetMongoCollection("ignoreOffers")
}
func ignoreOffer(profileId primitive.ObjectID, offerId primitive.ObjectID) error {
var offer IgnoreOffer
offer.ProfileID = profileId
ctx, _ := db.GetTimeoutContext()
filter := bson.M{"profileID": profileId}
update := bson.M{
"$set": bson.M{
"updatedAt": time.Now(),
},
"$push": bson.M{
"offers": offerId,
},
}
_, err := getIgnoreOffersCollection().UpdateOne(ctx, filter, update)
if err != nil {
log.Error("could not update ignoreOffer collection, err: ", err)
return err
}
return nil
}
您的情况需要更新插入:
_, err := getIgnoreOffersCollection().UpdateOne(ctx, filter, update, options.Update().SetUpsert(true))