4

データベース内に次のドキュメントがあります。

[
  {
    "_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」は、保管には無効です。

4

1 に答える 1

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)

また、配列要素のセレクターは単なる単一フィールドであるため、ここでは「ドット表記」形式で問題ないことに注意してください。通常$elemMatch、一致を確立するために配列に複数のフィールドがある場合にのみ必要です。

于 2014-08-02T10:09:16.053 に答える