web-dev-qa-db-ja.com

Mongooseを使用してMongoDBドキュメントからキーを削除する

Node.jsでMongoDBにアクセスするために Mongoose Libraryを使用しています

ドキュメントからキーを削除する方法はありますか?つまり、値を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();
});
76

初期のバージョンでは、node-mongodb-nativeドライバーをドロップダウンする必要がありました。各モデルには、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);
131
staackuser2

あなたはこれをしたいと思うでしょう:

User.findOne({}, function(err, user){
  user.key_to_delete = undefined;
  user.save();
});
43
deedubs

私はマングースを使用し、上記の関数のいずれかを使用することで要件を満たしました。関数はエラーなしでコンパイルされますが、フィールドはそのまま残ります。

user.set('key_to_delete', undefined, {strict: false} );

私のためにトリックをしました。

26
Noushad

Mongo構文でいくつかのキーを削除するには、次の手順を実行する必要があります。

{ $unset : { field : 1} }

Mongooseでも同じようです。

編集

this の例を確認してください。

5
Andrew Orsich

Mongooseドキュメントはプレーンなjavascriptオブジェクトではないため、delete演算子を使用できません(または 'lodash'ライブラリのunset)。

オプションはdoc.path = null ||を設定することです未定義またはDocument.toObject()メソッドを使用してmongoose docをプレーンオブジェクトに変換し、そこから通常どおり使用します。詳細については、mongoose api-refを参照してください。 http://mongoosejs.com/docs/api.html#document_Document-toObject

例は次のようになります。

User.findById(id, function(err, user) {
    if (err) return next(err);
    let userObject = user.toObject();
    // userObject is plain object
});
1
petarr

これは使用のような副次的な問題かもしれません

function (user)

の代わりに

function(err, user)

検索のコールバックのために?私はすでにケースを持っていたので、これを手伝おうとしています。

1
Luc

コレクションからキーを削除する場合は、この方法を試してください。これは私のために働いた

 db.getCollection('myDatabaseTestCollectionName').update({"FieldToDelete": {$exists: true}}, {$unset:{"FieldToDelete":1}}, false, true);
0
Bivin Vinod

これらすべての答えの問題は、それらが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 },
    );
}

0
Milad ranjbar