0

MongoDB の $set & $-operators に問題があります。既存の配列を変更しようとしています

私の更新方法は次のようになります (Clojure/Monger で記述されているため、正確なコピーを取得できません)。

    bulk.find({
            _id: 2,
            channelStatuses.channel: {$eq: "BAR"}
    }).update({
            $set: {"channelStatuses.$.status": "error" }
    });

私のデータは次のようになります。

{
  "_id" : "1",
  "channelStatuses" : [
    {
      "channel" : "FOO",
      "status" : "done"
    }
  ]
},
{
  "_id" : "2",
  "channelStatuses" : [
    {
      "channel" : "BAR",
      "status" : "done"
    }
  ]
},
{
  "_id" : "3",
  "channelStatuses" : [
    {
      "channel" : "BAZ",
      "status" : "error"
    }
  ]
},
{
  "_id" : "3",
  "channelStatuses" : []
}

したがって、ドキュメントの channelStatuses オブジェクトのステータスを _id = 2 に変更する必要があります。

代わりに、channelStatuses 配列内に新しいオブジェクトを作成し、ドキュメントは次のようになります。

    {
      "_id" : "2",
      "channelStatuses" : [
        {
          "channel" : "BAR",
          "status" : "done"
        },
        {
          "channel" : "BAR",
          "status" : ""
        }
      ]
    },
4

1 に答える 1

2

そのため、クエリにいくつかの問題が見つかりました。

  1. ドキュメントでは、_idフィールドはテキスト値ですが、クエリでは数値と​​して使用しています。

  2. あなたのクエリchannelStatuses.channel: {$eq: "BAR"}では無効です。二重引用符でエスケープしない限り、JSON キーを.内部に含めることはできません。

  3. 次のように簡略化できchannelStatuses.channel: {$eq: "BAR"}ます"channelStatuses.channel": "BAR"

次のクエリを試して、動作するかどうかを確認してください。

var bulk = db.doc.initializeUnorderedBulkOp();

bulk.find({ 
  _id: "2", 
  "channelStatuses.channel": "BAR" 
  }).update({
            $set: {"channelStatuses.$.status": "error" }
  });

bulk.execute();

既存のフィールドを更新するだけです。以下の最終出力を参照してください

{ 
    "_id" : "1", 
    "channelStatuses" : [
        {
            "channel" : "FOO", 
            "status" : "done"
        }
    ]
}
{ 
    "_id" : "2", 
    "channelStatuses" : [
        {
            "channel" : "BAR", 
            "status" : "error"
        }
    ]
}
{ 
    "_id" : "3", 
    "channelStatuses" : [
        {
            "channel" : "BAZ", 
            "status" : "error"
        }
    ]
}
于 2016-03-22T12:50:52.497 に答える