mongodb - mgo:如何更新文档中的特定数组

标签 mongodb go mongodb-query mgo

我的数据库中有这个文档:

[
  {
    "_id": "53dc97bf91f1f933e15d6fb1",
    "attributes": {
      "chilled": false,
      "flammable": false,
      "food": false,
      "fragile": false,
      "frozen": false,
      "hot": false,
      "outsized": false
    },
    "createdAt": "02/08/14 09:48:16",
    "customer": "53d68bc091f1f933e15d6f90",
    "location": [
      {
        "count": 0,
        "warehouse": "53db430c91f1f933e15d6fa6"
      },
      {
        "count": 34,
        "warehouse": "53db430c91g1f933e45d6fa4"
      },
    ],
    "name": "test",
    "type": "stored",
    "updatedAt": ""
  }
]

如果我知道仓库 ID,如何更新位置数组? 这就是我现在拥有的

coll := p.GetDb().C("product")
    changes := bson.M {
        "location": bson.M {
            "$elemMatch": bson.M {
                "warehouse": bson.ObjectIdHex(warehouseId),
            },
        },
        "$set": bson.M {
            "location.$.count": 4,
        }, 
    }
    
    err := coll.UpdateId(bson.ObjectIdHex(productId), changes)
    if err != nil {
        http.Error(res, err.Error(), 500)
        return
    }

但是得到这个错误:

The dollar ($) prefixed field '$elemMatch' in 'location.$elemMatch' is not valid for storage.

最佳答案

你写错了。仓库“id”值的匹配项属于语句的“查询”部分,而不属于“更新”部分。因此,您不需要 UpdateId 变体,而是 Update因为它允许更广泛的查询选择:

query := bson.M{
    "_id": bson.ObjectIdHex(productId),
    "location.warehouse": bson.ObjectIdHex(warehouseId)
}

update := bson.M{
    "$set": bson.M{
        "location.$.count": 4
    }
}

err := coll.Update(query,update)

另请注意 "dot notation" form 在这里很好,因为数组元素的选择器只是一个单一字段。您通常只需要 $elemMatch当数组中有多个字段时建立匹配。

关于mongodb - mgo:如何更新文档中的特定数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25093667/

相关文章:

c# - MongoDb C# 驱动程序 - 基于 "candidate"键更新插入许多内容

mongodb - 频率表生成 - MongoDB

mongodb - $project 一个新字段作为 mongodb 中两个字段的最小值

python - AWS DocumentDB 语法不同于 MongoDB 的 UpdateMany

mongodb - 在深度嵌套文档查询中使用 MongoDB 的位置运算符 $

go - 使用工厂模式时接口(interface)应该在哪里定义?

node.js - Mongoose 如何结合查找、排序、$ 和

google-app-engine - GoLang App Engine 结构名称

go - 如何在 Golang 中解码 Json 字符串以仅获取一个键的值

python - 如何聚合两个集合,其中一个集合的字段大于另一个集合