mongodb - 如何将 mongodb 投影与 Go 和 mgo 一起使用?

标签 mongodb go bson mgo

我目前正在尝试在 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 做同样的事情,并尝试了以下方法:

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

// 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("...") 调用是传递给处理程序的参数。

提前致谢。

最佳答案

将与 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)

关于mongodb - 如何将 mongodb 投影与 Go 和 mgo 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33751451/

相关文章:

Golang升序

go - 使用 RSA-2048 服务器公钥加密客户端私钥

go - 如何在proto文件中导入和使用protobuf timestamppb包?

mongodb - 如何使用 Go 更新 Mongodb 中的数组字段

mongodb - Scala MongoDB,重写编解码器以写入/读取数组[字节]

javascript - $http.delete 回调在基本 CRUD 应用程序中未触发

java - mongodb 获取数组值

mongodb - 为什么reactivemongo的collection.save()会执行get()?

.net - 无法将类型为 'MongoDB.Bson.BsonDocument' 的对象转换为类型 'MongoDB.Bson.BsonBinaryData'

python - 如何检查 mongo ObjectID 在 python 中是否有效?