Mongoose를 사용하여 MongoDB 문서에서 키 삭제


103

node.js로 MongoDB에 액세스하기 위해 Mongoose 라이브러리를 사용하고 있습니다.

문서에서 키제거 하는 방법이 있습니까? 즉 값을 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();
});

1
나는 그것을 찾았다 고 생각했지만 몇 가지 테스트 후에 : 아마 아닐 것이다. 이것은 주제에 대한 좋은 토론이 있습니다. groups.google.com/group/mongoose-orm/browse_thread/thread/…
Stephen

LOL은 신경 쓰지 않습니다. 이것이 귀하의 게시물이라고 생각합니다!
Stephen

답변:


168

초기 버전에서는 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);

Mongoose 2.X에서는이 문제가 수정되었으므로 컬렉션을 제외 할 수 있습니다.
staackuser2 2011

4
어느 사용 User.update({ _id: id }, { $unset: { field: 1 }}, callback)하면 문서 인스턴스가있는 경우, 그것을 저장 후 정의되지 않은 경로를 설정하고 나 :doc.field = undefined; doc.save()
aaronheckmann

25
스키마에 더 이상 정의되지 않은 이전 속성을 제거하려는 경우 수행해야합니다doc.set('field', undefined)
evilcelery 2013 년

3
삭제는 doc.field.foo어떻습니까?
쵸비

28
doc.set('field', undefined)엄격 모드 (기본값)는 더 이상 스키마에없는 필드를 설정할 수 없기 때문에 @evilcelery로는 충분하지 않을 수 있습니다. doc.set('field', undefined, { strict: false })잘 작동했습니다.
Alexander Link


30

나는 몽구스를 사용하고 위의 기능 중 하나를 사용하여 요구 사항을 충족했습니다. 이 함수는 오류없이 컴파일되지만 필드는 여전히 남아 있습니다.

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

나를 위해 트릭을했다.


이 유용한 답변을 찬성하면 @ alexander-link가 너무 나빠서 2015 년에 답변이되지 않았습니다 ( stackoverflow.com/questions/4486926/… )
w00t

1
귀하의 답변에 감사드립니다. 다른 솔루션은 배열에 중첩 된 객체에 대해 작동하지 않았습니다!
BenSower

@BenSower 이것도 제 경우였습니다. 나는 특정 문서의 ID를 찾은 후 배열과 필드를 삭제했기 때문에 만이 솔루션은 잘 작동
루이스 Febro

문자열은 키에 대한 경로입니다. 따라서 삭제하려는 개체가 중첩 된 경우 경로를 지정해야합니다. 이 답변이 내 문제를 해결했습니다!
Bradyo

8

mongo 구문에서 일부 키를 삭제하려면 다음을 수행해야합니다.

{ $unset : { field : 1} }

몽구스에서도 똑같이 보입니다.

편집하다

예를 확인하십시오 .


이 답변을 명확히하고 위의 예제 코드와 관련된 코드 예제를 제공 할 수 있습니까?
Daniel Beardsley 2011 년

미안하지만 몽구스에서 경험하지 못했습니다. 위의 구문은 mongo 구문이므로 모든 언어의 드라이버가 이것을 지원한다고 가정합니다. 몇 가지 예를 찾았습니다. 내 대답에서 확인하십시오.
Andrew Orsich 2011 년

1

이것이 사용과 같은 부수적 인 문제가 될 수 있습니까?

function (user)

대신에

function(err, user)

찾기의 콜백을 위해? 이미 사건이 있었기 때문에 이것을 돕기 위해 노력했습니다.


1

Mongoose 문서는 일반 자바 스크립트 객체가 아니므로 삭제 연산자를 사용할 수 없습니다. unset 'lodash'라이브러리에서).

옵션은 doc.path = null을 설정하는 것입니다 || undefined 또는 Document.toObject () 메서드를 사용하여 몽구스 문서를 일반 객체로 전환하고 거기에서 평소처럼 사용합니다. 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

시험:

User.findOne({}, function(err, user){
  // user.key_to_delete = null; X
  `user.key_to_delete = undefined;`

  delete user.key_to_delete;

  user.save();
});

0

이 모든 답변의 문제는 한 분야에서 일한다는 것입니다. 예를 들어 빈 문자열 인 경우 내 문서에서 모든 필드를 삭제하고 싶다고 가정 해 보겠습니다 "". 먼저 필드가 빈 문자열인지 확인해야합니다 $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

컬렉션에서 키를 제거하려면이 방법을 시도하십시오. 이것은 나를 위해 일했다

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.