使用gopkg.in/mgo.v2在Golang中的自定义mongoDB命令作为字符串



我想知道,无论如何是否有我自己的命令(或查询(,我在go中使用" mgo"构建为字符串变量。

类似的东西:

c := session.DB(DBNAME).C(COLLECTION)
c.RUN_COMMAND_AS_STRING("find({username:'vahid'})")

无论如何都可以运行我自己的命令(或查询(,我在GO中使用" MGO"构建为字符串变量。

您可以调用mongodb查找命令,然后解析查询过滤器的字符串到 map[string]interface{}

例如:

db := session.DB("databaseName")
queryString := `{"username":"sergio"}`
var filter map[string]interface{} 
err = json.Unmarshal([]byte(queryString), &filter)
result := bson.M{}
err = db.Run(bson.D{{"find", "collectionName"}, {"filter", filter}}, &result)
fmt.Println(result)

另外,根据用例,您还可以使用MongoDB聚合管道,而不是使用find()

例如:

pipeString := `[{"$match":{"username":"sergio"}}, {"$project":{"newfield":"$username"}}]`
pipe := []bson.M{}
err = json.Unmarshal([]byte(pipeString), &pipe)
coll := session.DB("databaseName").C("collectionName")
response := []bson.M{}
err = coll.Pipe(pipe).All(&response)  
fmt.Println(response)

这是我喜欢使用的:

func dbInsert(collection string, insert bson.M, session *mgo.Session) error {
    c := session.DB(your_DB).C(collection)
    err := c.Insert(insert)
    return err
}
func dbUpsert(collection string, selector bson.M, update bson.M, session *mgo.Session) (*mgo.ChangeInfo, error) {
    c := session.DB(your_DB).C(collection)
    info, err := c.Upsert(selector, update)
    return info, err
}
func dbFindOne(collection string, findBson bson.M, selectBson bson.M, session *mgo.Session) (map[string]interface{}, error) {
    c := session.DB(your_DB).C(collection)
    getMap := make(map[string]interface{})
    err := c.Find(findBson).Select(selectBson).One(&getMap)
    return getMap, err
}
func dbFindAll(collection string, findBson bson.M, selectBson bson.M, session *mgo.Session) (map[string]interface{}, error) {
    c := session.DB(your_DB).C(collection)
    getMap := make(map[string]interface{})
    err := c.Find(findBson).Select(selectBson).All(&getMap)
    return getMap, err
}
func dbUpdate(collection string, selector bson.M, update bson.M, session *mgo.Session) error {
    c := session.DB(your_DB).C(collection)
    setBson := bson.M{};
    setBson["$set"] = update;
    //
    updateError := c.Update(selector, setBson)
    //
    return updateError
}
func dbRemoveOne(collection string, selector bson.M, session *mgo.Session) error {
    c := session.DB(your_DB).C(collection)
    removeError := c.Remove(selector)
    return removeError
}
func dbRemoveAll(collection string, selector bson.M, session *mgo.Session) (*mgo.ChangeInfo, error) {
    c := session.DB(your_DB).C(collection)
    removeInfo, removeError := c.RemoveAll(selector)
    return removeInfo, removeError
}

这是查找的示例查询:

//FIND ONE:
employeeInfo, err := dbFindOne("employees", bson.M{"name": "john"}, bson.M{"salary": 1, "homeCity": 1}, mongo_session)
if err != nil {
    fmt.Println("Error getting employee info: ", err)
}else{
    //you can get the salary as an int:
    salary := employeeInfo["salary"].(int)
    //or get their homeCity as a string:
    homeCity := employeeInfo["homeCity"].(string)
}

例如,这在"员工"中找到了名为"约翰"的员工的"薪水"。

摘要中的所有方法都以与dbFindOne()相同的方式工作。

希望这会有所帮助!

最新更新