2017-04-06 3 views
0

のは、我々は、以下の形状の書類を含むMongoのコレクションを持っていると仮定しましょう:モンゴアレイ更新またはプッシュ

{ 
    _id: '1234', 
    letters: ['a', 'b', 'c', 'd'], 
} 

時にはlettersフィールドはnullかもしれません。 letters配列が非空である場合、それは単一のクエリ

  • に次のように達成することが可能である場合、私は疑問に思って

    、「X」に最初の項目を設定します。

  • lettersフィールドを['x']に設定してください。もちろん

、できるだけ簡単なアイデアがlettersフィールドがまだ上記の動作の結果はとなります設定されていないため、場合

db.collection.update({_id: '...'}, {$set:{'letters.0':'x'}}); 

を動作しません:

{ 
    // ... 
    letters: { 
    '0': 'x' 
    } 
} 

があります私の意図はオブジェクトではなく配列を作成することです。

答えて

1

演算子は$push、または配列に重複がある場合は$addToSetを使用できます。

あなたのクエリは次のようになります

db.collection.update({_id: '...'}, {$push:{'letters':'x'}}); 
db.collection.update({_id: '...'}, {$addToSet:{'letters':'x'}}); 
+0

Su私はすでにそこにいくつかの要素がある場合、私はそれが動作しないだろうと私は最初のものを更新したいと思います。 –

+0

ああ、私はあなたの質問を得る、あなたは指定された位置を更新したい、または配列を作成します。そういうわけで、$ set演算子をあなたの質問に置きます。 docs:https://docs.mongodb.com/manual/reference/operator/update-array/私はそのための演算子を見つけることができませんでした。$ - https://docs.mongodb.com/manual/参照/演算子/更新/位置の言及 "挿入が挿入されたドキュメントのフィールド名として$を使用するため、位置演算子$をアップサート操作で使用しないでください。"これはあなたが記述したのと同じ動作なので、私はあなたが1つのコマンドでそれを行うことはできないと思います。 –

0

あなたは

は古い最初の1

db.collection.update({_id:xx}, {$pop:{letters : -1}}) 

を飛び出し配列内の最初の1を更新したい場合はその後にプッシュ最初のもの

db.collection.update({_id:xx}, {$push:{letters : {$each:['first one'], $position:0}}}) 
関連する問題