我在我的数据库中有这个文件
[
{
"_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
}
但是得到这个错误:'location。$ elemMatch'中的美元($)前缀字段'$ elemMatch'对存储无效。
THX。
答案 0 :(得分:11)
你用错误的方式写了这个。仓库上的比赛" 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"表单在这里没问题,因为数组元素的选择器只是一个奇异的字段。当数组中有多个字段用于建立匹配时,通常只需要$elemMatch
。