Mongodb 无法使用golang更新Mongo中子元素的属性

Mongodb 无法使用golang更新Mongo中子元素的属性,mongodb,go,Mongodb,Go,我正在golang中处理mongo查询,使用mgo更新子元素属性 { "_id" : ObjectId("5b64a0d3931653c36bcaf0b5"), "quantity" : 2, "product" : "ABC", "children" : [ { "jiraId":"100" "isBlocked" : true,

我正在golang中处理mongo查询,使用mgo更新子元素属性

 {
        "_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
已经停产,但它仍然存在并在中得到改进。