ドキュメント内に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})"
}
})
は、なぜあなたは、あなたが問題の証明書は、あなたが求めるまったく同じ名前を更新しないだろうと思いますか?それは実際には正確に何ですか?既存のプロパティである 'null'をどのように問い合わせるかわからない場合を除きます。しかし、それは非常に基本的なことです。 –
編集中にエラーが発生しました。たぶん私はエラーを誤解しているかもしれませんが、それは 'null'にトラバースできないということです。 –