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

标签 mongodb go

我正在使用 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 .

另外,请注意数组字段 childrenfield 之间的附加 $。这是 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/

相关文章:

javascript - $inc 追随者数量,还是我应该使用聚合来跟踪他们?

python - MongoEngine是否在不同对象上缓存相同的引用?

go - 如何编写 Golang bson- MongoDB

pointers - Golang 自动引用,并不总是可以获得值的地址

node.js - GraphQL & Mongoose Schema - 如何存储对另一种类型的 mongoose objectId 引用数组?

MongoDB:通过不存在的字段查找文档?

javascript - 为什么 NodeJS shell 和编译器在变量赋值方面存在分歧?

go - Go 中的覆盖范围

go - 在 Go HTTP 处理程序中使用未导出的结构键获取上下文值时为 nil

go - conn.SetDeadline() 是否在超时时关闭连接