我目前正在尝试在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(“ …”)调用是传递给处理程序的参数。
提前致谢。
将与该 Select 方法一起使用,因为doc指出,这使得可以选择要为找到的结果检索哪些字段,因此 $elemMatch 可以在此处结合使用using 运算符进行投影 Select ,最终查询如下所示:
Select
$elemMatch
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)