我正在使用 mgo 在 golang 中进行 mongo 查询以更新子元素属性
{
"_id" : ObjectId("5b64a0d3931653c36bcaf0b5"),
"quantity" : 2,
"product" : "ABC",
"children" : [
{ "jiraId":"100"
"isBlocked" : true,
"blockedMessage" : "Error occurred: TRACEID",
"serialNo" : "abc123",
"token" : "",
}
]
}
我在下面使用的查询
Update(repository.MongoSpec{Selector: bson.M{"children": bson.M{"$elemMatch": bson.M{"jid": "100"}}}, Query: bson.M{"children": bson.M{"$set": fields}}})
下面是更新函数
s := spec.(MongoSpec).Selector
q := spec.(MongoSpec).Query
err := session.
DB(repo.config.databaseName).
C(repo.collectionName).
Update(s, q)
MongoSpec 结构体
type MongoSpec struct {
Selector interface{}
Query interface{}
}
上面的查询抛出如下错误
The dollar ($) prefixed field '$set' in 'children.$set' is not valid for storage.
我可以知道查询有什么问题吗。
最佳答案
Update(repository.MongoSpec{Selector: bson.M{"children": bson.M{"$elemMatch": bson.M{"jid": "100"}}}, Query: bson.M{"children": bson.M{"$set": fields}}})
如果在 $elemMatch 中只指定一个查询条件表达式,您不需要使用 $elemMatch
。只需使用 dot notation访问数组或嵌入文档的元素。例如在 mongo外壳:
db.collection.update(
{"children.jid": "100"},
{"$set":{"children.$.field":"foobar"}})
注意更新运算符$set在任何字段之前首先指定。另见 Set Fields in Embedded Documents .
另外,请注意数组字段 children
和 field
之间的附加 $
。这是 positional $ operator to 标识数组中要更新的元素,而无需显式指定数组中元素的位置。例如,如果您在 children
中有两个元素,则仅将更新运算符应用于匹配 jid="100"
的元素。
与mgo.v2
类似,您可以指定:
err = c.Update(
bson.M{"children.jid":"100"},
bson.M{"$set":bson.M{"children.$.field":"foobar"}}
)
值得一提的是,mgo.v2
已经停产,如果您要开始一个新项目,请使用 mongo-go-driver支持 MongoDB v3.2 及以上版本。
关于mongodb - 无法使用golang更新Mongo中子元素的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51849941/