如何在Golang中运行MongoDB查询,并$cond

我尝试在Golang中运行MongoDB查询并收到一些错误。如果字段“section.gateBack”等于0,我想用新的时间戳更新字段“expiresAt”。


数据模型如下所示:


{

  "_id": "78b0e7de-c24c-11eb-8529-0242ac130003",

  "expiresAt": "2021-04-22T14:06:55.069Z",

  "section": {

    "gateFront": 1,

    "gateMiddle": 1,

    "gateBack": 0

  }

}

在第一次尝试中,我编写了查询,就像我执行其他(简单)$set操作一样,但这次使用$cond使用if-else:


filter := bson.M{

    "_id": iD,

}


update := bson.M{

    "$set": bson.M{

        "expiresAt": bson.M{

            "$cond": bson.M{

                "if": bson.M{

                    "$and": []bson.M{

                        {"section.gateBack": bson.M{"$eq": 0}},

                        {"section.gateBack": bson.M{"$exists": true}},

                    },

                },

                "then": time.Now().AddDate(0, 1, 0),

                "else": time.Now().AddDate(0, 0, 1),

            },

        },

    },

}


res, err := s.coll.UpdateOne(

    ctx,

    filter,

    update,

)

但是使用此更新操作,我得到以下错误:


multiple write errors: [{write errors: [{The dollar ($) prefixed field '$cond' in 'expiresAt.$cond' is not valid for storage.}]}, {<nil>}]

我在MongoDB开发人员方面发现了一个问题,它说更新值必须是一个数组:https://developer.mongodb.com/community/forums/t/mongoerror-the-dollar-prefixed-field-cond-in-energy-cond-is-not-valid-for-storage/16448


当我阅读MongoDB的官方文档时,这是有道理的,用于使用聚合管道的UpdateOne():https://docs.mongodb.com/manual/reference/method/db.collection.updateOne/#example-2


因此,我更改了我的更新值并将其附加到 bson 数组中。M:


filter := bson.M{

    "_id": iD,

}



var pipeline []bson.M


update := bson.M{

    "$set": bson.M{

        "expiresAt": bson.M{

            "$cond": bson.M{

                "if": bson.M{

                    "$and": []bson.M{

                        {"section.gateBack": bson.M{"$eq": 0}},

                        {"section.gateBack": bson.M{"$exists": true}},

                    },

                },

                "then": time.Now().AddDate(0, 1, 0),

                "else": time.Now().AddDate(0, 0, 1),

            },

        },

    },

}

pipeline = append(pipeline, update)


res, err := s.coll.UpdateOne(

    ctx,

    filter,

    pipeline,

)


江户川乱折腾
浏览 118回答 2
2回答

慕桂英4014372

在转换查询时,使用映射和切片类型并查找类型来代替 mongo 驱动程序别名。bson.A{bson.M{...}, bson.M{...}}[]bson.M{...}bson.M{}bson.A{}

湖上湖

很抱歉回复晚了。我完全忘记了发布解决方案。就像@prasad_说的,我试图使用开关盒运算符,但使用.UpdateOne()ctx := context.Background()filter := bson.M{&nbsp; &nbsp; "_id": ID,}back := bson.M{&nbsp; &nbsp; "case": bson.M{&nbsp; &nbsp; &nbsp; &nbsp; "$and": []bson.M{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {"$gt": []interface{}{"$section.gateBack", 0}},&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {"$exists": []interface{}{"$section.gateBack", true}},&nbsp; &nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; },&nbsp; &nbsp; "then": time.Now().AddDate(0, 0, 1),}middle := bson.M{&nbsp; &nbsp; "case": bson.M{&nbsp; &nbsp; &nbsp; &nbsp; "$and": []bson.M{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {"$gt": []interface{}{"$section.gateMiddle", 0}},&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {"$exists": []interface{}{"$section.gateMiddle", true}},&nbsp; &nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; },&nbsp; &nbsp; "then": time.Now().AddDate(0, 1, 0),}front := bson.M{&nbsp; &nbsp; "case": bson.M{&nbsp; &nbsp; &nbsp; &nbsp; "$and": []bson.M{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {"$gt": []interface{}{"$section.gateFront", 0}},&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {"$exists": []interface{}{"$section.gateFront", true}},&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {"$in": []interface{}{"$section.access", []string{"gate", "door"}}},&nbsp; &nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; },&nbsp; &nbsp; "then": time.Now().AddDate(1, 0, 0),}cases := bson.A{back, middle, front}update := []bson.M{&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; "$set": bson.M{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "expiresAt": bson.M{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "$switch": bson.M{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "branches": cases,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "default":&nbsp; time.Now().AddDate(0, 0, 0),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; },}res, err := coll.UpdateOne(&nbsp; &nbsp; ctx,&nbsp; &nbsp; filter,&nbsp; &nbsp; update,)if err != nil {&nbsp; &nbsp; return 0, err}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go