2017-07-15 16 views
-1

ドキュメント内にnullの可能性があるフィールドがあります。その文書の内部フィールドを更新し、nullの場合はそのフィールドをオブジェクトとして作成します。デモンストレーションとして:最初にヌルのネストされたプロパティを更新します。

say the document looks like this: { 
    id: "xyz", 
    name: null 
} 

db.update({id: "xyz"}, {$set: {"name.first": "Joe"}}) 

これで、実行時に、名前フィールドがnullかどうかわかりません。 nameがnullの場合、name{ first: "Joe" }に更新したいだけです。

私は実際にそのスキーマなどであるマングースモデルを通じて、これをやっている:

{ 
    name: { 
     default: null, 
     type: { 
      first: { 
       type: String 
      }, 
      middle: { 
       type: String, 
      }, 
      last: { 
       type: String, 
      }, 
      display: { 
       type: String, 
      } 
     } 
    } 
} 

は1つのクエリで更新を実行する方法はありますか?または、私は2つのステップでそれを行う必要がありますか(現在の値をnameに取得し、それを増やして設定する)?

編集:ここで私はあなたが一致する文書をクエリを実行してのみ更新することができますfindAndModify()を使用することができますMongoDBのではコンソール

> db.users.findAndModify({ query: { _id: ObjectId("596958d60782a56eb3ba3d93") }, update: { '$set': { 'name.display': 'dfgdfgfgf' } }}) 
2017-07-14T20:13:45.855-0400 findAndModifyFailed failed: { 
"value" : { 
    "_id" : ObjectId("596958d60782a56eb3ba3d93"), 
    "sessionID" : "2bPzS2lqkDxN-3XEQRw60GAB93XODi4Y", 
    "profilePhotoURL" : null, 
    "name" : null, 
    "__v" : 0 
}, 
"errmsg" : "exception: cannot use the part (name of name.display) to traverse the element ({name: null})", 
"code" : 16837, 
"ok" : 0 
} at src/mongo/shell/collection.js:614 

> db.users.update({ _id: ObjectId("596958d60782a56eb3ba3d93") }, {$set: {"name.display": "sdfsdfsfd"}}) 
WriteResult({ 
"nMatched" : 0, 
"nUpserted" : 0, 
"nModified" : 0, 
"writeError" : { 
    "code" : 16837, 
    "errmsg" : "cannot use the part (name of name.display) to traverse the element ({name: null})" 
} 
}) 
+0

は、なぜあなたは、あなたが問題の証明書は、あなたが求めるまったく同じ名前を更新しないだろうと思いますか?それは実際には正確に何ですか?既存のプロパティである 'null'をどのように問い合わせるかわからない場合を除きます。しかし、それは非常に基本的なことです。 –

+0

編集中にエラーが発生しました。たぶん私はエラーを誤解しているかもしれませんが、それは 'null'にトラバースできないということです。 –

答えて

0

でそれを実行したときに、私は何を得るのです。

操作はアトミックに行われるため、一度検出されると、更新が行われるまで他の操作ではドキュメントを読み取ることができません。これは他の状況でも有効です。それで、writeConcernがAPIで調整可能になっています。

例:

db.collection.findAndModify({ 
query: { 
    name: null 
}, 
update: { 
    name: { first: "Joe" } 
} 
}) 
+0

編集したOPのエラーメッセージを参照 –

+0

違いがわかります:オブジェクトで更新していますが、パス文字列( "name.first": "Joe")で更新しようとしています –

関連する問題