Mongooseを使用してMongoDBドキュメントからキーを削除します
-
11-10-2019 - |
質問
私は使用しています マングース node.jsでmongodbにアクセスするためのライブラリ
する方法はありますか ドキュメントからキーを削除します?つまり、値をnullに設定するだけでなく、削除しますか?
User.findOne({}, function(err, user){
//correctly sets the key to null... but it's still present in the document
user.key_to_delete = null;
// doesn't seem to have any effect
delete user.key_to_delete;
user.save();
});
解決
初期のバージョンでは、ノードモンゴドブネイティブドライバーをドロップダウンする必要がありました。各モデルには、Node-Mongodb-Nativeが提供するすべての方法を含むコレクションオブジェクトがあります。したがって、これにより問題のアクションを行うことができます。
User.collection.update({_id: user._id}, {$unset: {field: 1 }});
バージョン2.0以来、:
User.update({_id: user._id}, {$unset: {field: 1 }}, callback);
バージョン2.4以来、モデルのインスタンスがすでにある場合は、次のことができます。
doc.field = undefined;
doc.save(callback);
他のヒント
あなたはこれをしたいです:
User.findOne({}, function(err, user){
user.key_to_delete = undefined;
user.save();
});
私はMongooseを使用しており、上記の機能のいずれかを使用すると要件がありました。関数はエラーを完全にコンパイルしますが、フィールドはまだ残ります。
user.set('key_to_delete', undefined, {strict: false} );
私のためにトリックをしました。
これは使用のような副問題かもしれません
function (user)
それ以外の
function(err, user)
発見のコールバックのために?私がすでに事件を持っていたので、これを手伝おうとしています。
Mongooseドキュメントは単純なJavaScriptオブジェクトではなく、削除オペレーターを使用できない理由です(または unset
「Lodash」ライブラリから)。
オプションはdoc.path = null ||を設定することです未定義またはdocument.toobject()メソッドを使用して、mongoose docをプレーンオブジェクトに変換し、そこから通常どおり使用します。詳細については、Mongoose Api-Ref:http://mongoosejs.com/docs/api.html#document_document to object
例は次のようになります:
User.findById(id, function(err, user) {
if (err) return next(err);
let userObject = user.toObject();
// userObject is plain object
});
これらすべての答えの問題は、それらが1つの分野で働くということです。たとえば、空の文字列の場合、ドキュメントからすべてのフィールドを削除したいとしましょう ""
。最初に、フィールドが空のかどうかを確認する必要があります $unset
:
function unsetEmptyFields(updateData) {
const $unset = {};
Object.keys(updatedData).forEach((key) => {
if (!updatedData[key]) {
$unset[key] = 1;
delete updatedData[key];
}
});
updatedData.$unset = $unset;
if (isEmpty(updatedData.$unset)) { delete updatedData.$unset; }
return updatedData;
}
function updateUserModel(data){
const updatedData = UnsetEmptyFiled(data);
const Id = "";
User.findOneAndUpdate(
{ _id: Id },
updatedData, { new: true },
);
}
コレクションからキーを削除する場合は、この方法をお試しください。 これは私のために働いた
db.getCollection('myDatabaseTestCollectionName').update({"FieldToDelete": {$exists: true}}, {$unset:{"FieldToDelete":1}}, false, true);
delete user._doc.keyを使用できます