mongodb - 使用 golang bson 从 mongo 获取整个元素的问题,而不是只返回子元素

标签 mongodb go bson mgo

我正在 golang 中使用 mgo 查询子元素以返回整个元素的 mongo 查询

{
    "_id" : ObjectId("5b64a0d3931653c36bcaf0b5"),
    "quantity" : 2,
    "product" : "ABC",   
    "children" : [ 
        {           
            "isBlocked" : true,
            "blockedMessage" : "Error occurred: TRACEID",
            "serialNo" : "abc123",
            "token" : "foo456",            
        }
    ]
}

我在下面使用的查询 bson.M{"_id": 0, "children": bson.M{"$elemMatch": {serialNo: 'abc123'}}}

Find(MongoSpec{Selector: bson.M{}, Query: bson.M{"_id": 0, "children": bson.M{"$elemMatch": fields}}})

下面是查找函数

    documents := []interface{}{}
        s := spec.(MongoSpec).Selector
        q := spec.(MongoSpec).Query
        query := session.
            DB(repo.Config.DatabaseName).
            C(repo.CollectionName).
            Find(s)

        if q != nil {
            query = query.Select(q)
        }

        err := query.All(&documents)

MongoSpec 结构体

  type MongoSpec struct {
        Selector interface{}
        Query    interface{}
    }

上面的查询工作正常,但只返回如下的子元素

"children" : [ 
            {           
                "isBlocked" : true,
                "blockedMessage" : "Error occurred: TRACEID",
                "serialNo" : "abc123",
                "token" : "foo456",            
            }
        ]

我没有得到查询有什么问题。

最佳答案

$elemMatch 作为 query 存在 和一个 projection . 查询用于实际过滤返回哪些文档,投影确定显示返回文档的哪一部分。重申一下:Projection 不会过滤返回哪些文档,它会限制每个文档返回哪些值(类似于 SQL 的 SELECT 部分)。

mgo 的Find 函数是查询,Select 是投影。因此,您希望最终代码看起来更接近于此:

c.Find(
    bson.M{
        "children": bson.M{
            "$elemMatch": bson.M{serialNo: "abc123"},
        },
    },
).Select(
    bson.M{
        "_id": 0,
    },
)

根据您设置代码的方式,这就是它的样子。

Find(
    MongoSpec{
        Selector: bson.M{"children": bson.M{"$elemMatch": fields}},
        Query: bson.M{"_id": 0},
    },
)

但是,我强烈建议您重命名 MongoSpec 中的字段(完全删除它和 Find 函数也不是一个坏主意)。您使用 Query 作为投影(.Select() 函数)并使用 Selector 作为查询(.Find() )。这可能就是您最初犯此错误的原因。

关于mongodb - 使用 golang bson 从 mongo 获取整个元素的问题,而不是只返回子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51730044/

相关文章:

C# MongoDB。在数组中查找项目并仅选择此项

centos 7 mongodb无法启动

go - 在使用 gin gonic 进行负载测试期间打开的文件过多

exception-handling - 在 Golang 中捕捉 panic

python-3.x - pymongo 将 mongoDB 日期转换为 python 日期时间

Facebook user_id 作为 MongoDB BSON ObjectId?

mongodb - 快速写入 MongoDB 控制台,缓慢写入 ReplSet

node.js - 如何在谷歌云上使用nodejs虚拟机提供我的内容

go - 在 Go 中使用互斥锁

php - 将 Mongo 游标正确解析为 PHP