我正在使用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())。这也许就是为什么您首先犯此错误的原因。
- 1 回答
- 0 关注
- 306 浏览
添加回答
举报
0/150
提交
取消