为了账号安全,请及时绑定邮箱和手机立即绑定

问题是使用golang bson从mongo获取整个元素,而仅返回了子元素

问题是使用golang bson从mongo获取整个元素,而仅返回了子元素

Go
慕沐林林 2021-03-28 12:19:14
我正在使用mgo在golang中进行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",                        }        ]我没有得到查询有什么问题。
查看完整描述

1 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

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


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())。这也许就是为什么您首先犯此错误的原因。


查看完整回答
反对 回复 2021-04-19
  • 1 回答
  • 0 关注
  • 306 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信