2016-09-21 4 views
1

MongoDBの配列要素を更新する際に問題が発生しました。これは文書の構造です:MongoDB文書の配列要素を更新する方法

{ 
     "_id" : ObjectId("57e2645e11c979157400046e"), 
     "site" : "BLABLA", 
     "timestamp_hour" : 1473343200, 
     "values" : [ 
       { 
         "1473343200" : 66 
       }, 
       { 
         "1473344100" : 230 
       }, 
       { 
         "1473345000" : 479 
       }, 
       { 
         "1473345900" : 139 
       } 
     ] 
} 

ここで、キー "1473345900"で要素を更新したいとします。これどうやってするの?

db.COLLECTIONNAME.update({"values.1473345900": {$exists:true}}, {$set: {"values.$": 0}}) 

をしかし、文書は次のようになり、その後:私が試した私が間違ってやっている何

{ 
     "_id" : ObjectId("57e2645e11c979157400046e"), 
     "site" : "BLABLA", 
     "timestamp_hour" : 1473343200, 
     "values" : [ 
       { 
         "1473343200" : 66 
       }, 
       { 
         "1473344100" : 230 
       }, 
       { 
         "1473345000" : 479 
       }, 
       0 
     ] 
} 

? 1473345900の値を任意の値に更新したいだけです...完全な要素を更新したくない...

ありがとうございます!!!

答えて

2

更新する配列要素に一致する追加のクエリを追加する必要があります。一般的なクエリでは、要素の値が更新されている値と等しくないかどうかを調べる必要があります。

次の例の更新はこれを示しており、$位置演算子は、ハッシュキー配列要素{ "1473345900": 139 }の正しいインデックス位置を特定します。あなたは$位置オペレータなしで更新操作を実行しようとした場合:

db.COLLECTIONNAME.update(
    { "values.1473345900": { "$exists": true } }, 
    { "$set": { "values.1473345900": 0 } } 
) 

モンゴはインデックス位置としてのタイムスタンプ1473345900を扱いますので、あなたがエラーを取得します

は埋め戻しすることはできませんより大きい1500000の要素

にアレイしたがって正しい方法がなければならない:

var val = 32; 
db.COLLECTIONNAME.update(
    { "values.1473345900": { "$ne": val, "$exists": true } }, 
    { "$set": { "values.$.1473345900": val } } 
) 
+0

問題は次のとおりです。** ** 1473345900 **が既に存在するかどうかわかりません。だから1)** 1473345900 **が存在するかどうかを知る必要があり、2)** 1473345900 **の値を更新する必要があります。申し訳ありませんが、私はそれを説明することを忘れました... – tmieruch

+1

'db.sites.update({" values.1473345900 ":{$ exists:true}}、{$ set:{" values。$。1473345900 ":0}}) 'それがうまくいくでしょう。 Thx、Chridam !!! – tmieruch

関連する問題