使用golang-bson从mongo获取整个元素时出现问题,只返回子元素



我正在golang中处理一个mongo查询,使用mgo查询子元素以返回整个元素

{
"_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",            
}
]

我不知道这个查询出了什么问题。

$elemMatch既是查询又是投影查询用于实际筛选返回的哪些文档,投影确定显示返回的文档的哪个部分。重申一下:Projection不过滤返回的文档,它限制每个文档返回的值(类似于SQL的SELECT部分(。

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()(。这可能就是你当初犯这个错误的原因。

最新更新