Mongodb 无法使用golang更新Mongo中子元素的属性
我正在golang中处理mongo查询,使用mgo更新子元素属性Mongodb 无法使用golang更新Mongo中子元素的属性,mongodb,go,Mongodb,Go,我正在golang中处理mongo查询,使用mgo更新子元素属性 { "_id" : ObjectId("5b64a0d3931653c36bcaf0b5"), "quantity" : 2, "product" : "ABC", "children" : [ { "jiraId":"100" "isBlocked" : true,
{
"_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)
MongoSec结构
type MongoSpec struct {
Selector interface{}
Query interface{}
}
上面的查询抛出一个错误,如下所示
The dollar ($) prefixed field '$set' in 'children.$set' is not valid for storage.
我可以知道查询有什么问题吗。我认为您没有正确使用$set,请检查此示例并使其适应您的语言:
getCollection('collectionName').findOneAndUpdate(
{"children.jiraId":100}, //Search the subdocument
{$set:{"children.$.isBloqued":false}}}, //update the subdocument
)
我认为您没有正确使用$set,请检查此示例并使其适应您的语言:
getCollection('collectionName').findOneAndUpdate(
{"children.jiraId":100}, //Search the subdocument
{$set:{"children.$.isBloqued":false}}}, //update the subdocument
)
更新(repository.mongosec{Selector:bson.M{“children”:bson.M{“$elemMatch”:bson.M{“jid”:“100}}}}},查询:bson.M{“children”:bson.M{“$set”:fields}})
如果在表达式中仅指定一个查询条件,则不需要使用$elemMatch
。仅用于访问数组或嵌入文档的元素。例如,在shell中:
请注意,在任何字段之前首先指定update运算符。另见
另外,请注意数组字段子项
和字段
之间的额外$
。这是一种标识数组中要更新的元素的方法,无需显式指定元素在数组中的位置。例如,如果在子项中有两个元素
,则仅对匹配jid=“100”
的元素应用更新运算符
类似地,使用mgo.v2
,您可以指定:
err = c.Update(
bson.M{"children.jid":"100"},
bson.M{"$set":bson.M{"children.$.field":"foobar"}}
)
值得一提的是,
mgo.v2
已经停产,如果您正在启动一个新项目,请使用它来支持MongoDB v3.2及更高版本
更新(repository.mongosec{Selector:bson.M{“children”:bson.M{“$elemMatch”:bson.M{“jid”:“100}}}}},查询:bson.M{“children”:bson.M{“$set”:fields}})
如果在表达式中仅指定一个查询条件,则不需要使用$elemMatch
。仅用于访问数组或嵌入文档的元素。例如,在shell中:
请注意,在任何字段之前首先指定update运算符。另见
另外,请注意数组字段子项
和字段
之间的额外$
。这是一种标识数组中要更新的元素的方法,无需显式指定元素在数组中的位置。例如,如果在子项中有两个元素
,则仅对匹配jid=“100”
的元素应用更新运算符
类似地,使用mgo.v2
,您可以指定:
err = c.Update(
bson.M{"children.jid":"100"},
bson.M{"$set":bson.M{"children.$.field":"foobar"}}
)
值得一提的是,
mgo.v2
已经停产,如果您正在启动一个新项目,请使用它来支持MongoDB v3.2及更高版本 mgo.v2
已经停产,但它仍然存在并在中得到改进。mgo.v2
已经停产,但它仍然存在并在中得到改进。