如何在 mgo 中构造 $or 查询

Posted

技术标签:

【中文标题】如何在 mgo 中构造 $or 查询【英文标题】:How to construct an $or query in mgo 【发布时间】:2015-02-04 01:36:29 【问题描述】:

我正在尝试将此 JS MongoDB 查询转换为 Go mgo 查询:

var foo = "bar";
db.collection.find("$or": [ uuid: foo, name: foo ] );

这是我到目前为止所得到的,但它不起作用:

conditions := bson.M"$or": []bson.Mbson.M"uuid": name, bson.M"name": name

编辑:它现在似乎确实有效。也许我在某个地方打错了。

【问题讨论】:

sn-p 的语法看起来是正确的。你能展示更多你的代码吗? 【参考方案1】:

这是一个对我来说很好的完整示例(使用 Go 1.4 和 MongoDB 2.6.5)

package main

import (
    "fmt"
    "log"
    "gopkg.in/mgo.v2"
    "gopkg.in/mgo.v2/bson"
)

type Person struct 
    Num int
    Uuid string
    Name string


func main() 

    // Connect to the database
    session, err := mgo.Dial("localhost")
    if err != nil 
            panic(err)
    
    defer session.Close()

    // Remove people collection if any
    c := session.DB("test").C("people")
    c.DropCollection()

    // Add some data        
    err = c.Insert(&Person 1, "UUID1", "Joe",
                   &Person 2, "UUID2", "Jane", 
                   &Person 3, "UUID3", "Didier" )
    if err != nil 
            log.Fatal(err)
    

    result := Person
    err = c.Find( bson.M "$or": []bson.M bson.M"uuid":"UUID0", bson.M"name": "Joe"   ).One(&result)
    if err != nil 
            log.Fatal(err)
    

    fmt.Println(result)

【讨论】:

很好的答案!仅供参考,在切片中重新声明类型是多余的,这就足够了:err = c.Find( bson.M "$or": []bson.M"uuid":"UUID0", "name": "Joe" ).One(&result) 不重要,但我认为更简洁。【参考方案2】:
    package main

    import (
     "fmt"
        "gopkg.in/mgo.v2"
        "gopkg.in/mgo.v2/bson"

    )
func GetAll()[]interface
           //Data Base Instance
        session, err := mgo.Dial("localhost")
        c := session.DB("yourDbName").C("YourCollectionName")
            foo := "bar"
            orQuery := []bson.M
            uidFindQuery := bson.Muuid: foo
            nameFindQuery := bson.Mname: foo
            orQuery = append(orQuery, uidFindQuery, nameFindQuery)
             result := []interface
            err := c.Find(bson.M"$or":orQuery).All(&result);
           fmt.Println("error", err)
           fmt.Println("Your expected Data",result)
           return result

    `

参考 https://gopkg.in/mgo.v2 go lang 的最佳 Mongo db 接口

【讨论】:

以上是关于如何在 mgo 中构造 $or 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 golang 的 mgo 包进行类似查询

使用 golang 和 mgo,如何在 MongoDB 中搜索一系列值?

如何使用 Go 驱动程序或 mgo/qmgo 在 MongoDB 中存储地理空间数据?

mgo中的Golang Bson排序参数

带有 mgo 的 Go (golang) 中的 MongoDB:如何更新记录、确定更新是不是成功并在单个原子操作中获取数据?

我如何知道一个 mgo 会话是不是已关闭