gpt4 book ai didi

mongodb - 使用 golang bson 从 mongo 获取整个元素的问题,而不是只返回子元素

转载 作者:IT王子 更新时间:2023-10-29 01:44:09 26 4
gpt4 key购买 nike

我正在 golang 中使用 mgo 查询子元素以返回整个元素的 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",
}
]

我没有得到查询有什么问题。

最佳答案

$elemMatch 作为 query 存在 和一个 projection . 查询用于实际过滤返回哪些文档,投影确定显示返回文档的哪一部分。重申一下: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() )。这可能就是您最初犯此错误的原因。

关于mongodb - 使用 golang bson 从 mongo 获取整个元素的问题,而不是只返回子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51730044/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com