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

我正在使用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",            

            }

        ]

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


慕沐林林
浏览 307回答 1
1回答

慕标5832272

$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())。这也许就是为什么您首先犯此错误的原因。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go