猿问

如何在 Go 和 mgo 中使用 mongodb 投影?

我目前正在尝试在 mongodb 内的文档数组中提取单个对象。这是一个示例数据集:


"_id" : ObjectId("564aae61e0c4e5dddb07343b"),

"name" : "The Races",

"description" : "Horse races",

"capacity" : 0,

"open" : true,

"type" : 0,

"races" : [

    {

        "_id" : ObjectId("564ab9097628ba2c6ec54423"),

        "race" : {

            "distance" : 3000,

            "user" : {

                "_id" : ObjectId("5648bdbe7628ba189e011b18"),

                "status" : 1,

                "lastName" : "Miranda",

                "firstName" : "Aramys"

            }

        }

    },

    {

        "_id" : ObjectId("564ab9847628ba2c81f2f34a"),

        "bet" : {

            "distance" : 3000,

            "user" : {

                "_id" : ObjectId("5648bdbe7628ba189e011b18"),

                "status" : 1,

                "lastName" : "Miranda",

                "firstName" : "Aramys"

            }

        }

    },{...}

]

我可以在 mongo 中使用以下内容成功查询:


db.tracks.find({"_id": ObjectId("564aae61e0c4e5dddb07343b")}, {"races": { $elemMatch: {"_id": ObjectId("564ab9847628ba2c81f2f34a")}}}).pretty()

我无法使用 mgo 做同样的事情,并尝试了以下方法:


使用嵌套(抛出:复合文字中缺少类型,地图文字中缺少键)


// Using nesting (Throws: missing type in composite literal, missing key in map literal)

c.Find(bson.M{{"_id": bson.ObjectIdHex(p.ByName("id"))}, bson.M{"races": bson.M{"$elemMatch": bson.M{"_id": bson.ObjectIdHex(p.ByName("raceId"))}}}}).One(&result)


// Using select (Returns empty)

c.Find(bson.M{"_id": bson.ObjectIdHex(p.ByName("id"))}).Select(bson.M{"races._id": bson.ObjectIdHex(p.ByName("raceId"))}).One(&result)


//As an array (Returns empty)

c.Find([]bson.M{{"_id": bson.ObjectIdHex(p.ByName("id"))}, bson.M{"races": bson.M{"$elemMatch": bson.M{"_id": bson.ObjectIdHex(p.ByName("raceId"))}}}}).One(&result)

我正在使用 httprouter 和 p.ByName("...") 调用是传递给处理程序的参数。


提前致谢。


精慕HU
浏览 149回答 1
1回答

湖上湖

将采用该Select方法,因为文档指出这可以选择应为找到的结果检索哪些字段,因此$elemMatch可以在此处结合使用运算符进行投影Select,最终查询类似于:c.Find(bson.M{    "_id": bson.ObjectIdHex(p.ByName("id"))}).Select(bson.M{    "races": bson.M{        "$elemMatch": bson.M{            "_id": bson.ObjectIdHex(p.ByName("raceId"))        }    }}).One(&result)
随时随地看视频慕课网APP

相关分类

Go
我要回答