Mongoose kullanarak MongoDB belgesinden bir anahtarı silme


103

MongoDB'ye node.js ile erişmek için Mongoose Kitaplığını kullanıyorum

Bir belgeden anahtar çıkarmanın bir yolu var mı ? yani, yalnızca değeri null olarak ayarlamakla kalmayıp, onu kaldırır mısınız?

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
Bulduğumu sanıyordum, ama bazı testlerden sonra: muhtemelen bulamadım. Yine de konuyla ilgili bazı iyi tartışmalar var. groups.google.com/group/mongoose-orm/browse_thread/thread/…
— Stephen

LOL boşver, sanırım bu senin yazındı!
— Stephen

Yanıtlar:


168

İlk sürümlerde, node-mongodb-native sürücüsünü indirmeniz gerekecekti. Her model, node-mongodb-native tarafından sunulan tüm yöntemleri içeren bir koleksiyon nesnesine sahiptir. Böylece söz konusu eylemi şununla yapabilirsiniz:

User.collection.update({_id: user._id}, {$unset: {field: 1 }});

2.0 sürümünden beri şunları yapabilirsiniz:

User.update({_id: user._id}, {$unset: {field: 1 }}, callback);

Ve 2.4 sürümünden beri, bir modelin örneğine sahipseniz, şunları yapabilirsiniz:

doc.field = undefined;
doc.save(callback);

Bu, Mongoose 2.X'te düzeltildi, böylece koleksiyonu dışarıda bırakabilirsiniz.
— staackuser2

4
Ya kullanın User.update({ _id: id }, { $unset: { field: 1 }}, callback)ya da bir belge örneğiniz varsa, yolu tanımsız olarak ayarlayın ve ardından kaydedin:doc.field = undefined; doc.save()
— aaronheckmann

25
doc.set('field', undefined)
— Şemanızda

3
peki ya silme doc.field.foo?
— chovy

28
doc.set('field', undefined)Sıkı mod (varsayılan) artık şemada olmayan alanların ayarlanmasına izin vermediğinden @evilcelery yeterli olmayabilir. doc.set('field', undefined, { strict: false })iyi çalıştı.
— Alexander Link


30

Firavun faresini kullanıyorum ve yukarıdaki işlevlerden herhangi birini kullanmak bana şartı sağladı. İşlev hatasız derler ancak alan yine de kalır.

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

benim için hile yaptı.


Bu yararlı yanıta oy vermek çok kötü @ alexander-link 2015'te yanıt vermedi ( stackoverflow.com/questions/4486926/… )
— w00t

1
Cevabınız için teşekkür ederim, benim için diğer çözümler dizilerdeki nesneler için işe yaramadı!
— BenSower

@BenSower Bu benim de davamdı. Yalnızca bu çözüm işe yaradı çünkü belirli bir belgenin kimliğini bulduktan sonra dizi içeren bir alanı silmek zorunda kaldım
— Luis Febro

Dizenin anahtara giden bir yol olduğuna dikkat edin. Dolayısıyla, silmek istediğiniz nesne yuvalanmışsa, ona giden yolu bulmanız gerekir. Bu cevap sorunumu çözdü!
— Bradyo

8

Mongo sözdiziminde bazı anahtarları silmek için aşağıdakileri yapmanız gerekir:

{ $unset : { field : 1} }

Mongoose'da aynı görünüyor.

Düzenle

Kontrol bu örnek.


Bu yanıtı netleştirip yukarıdaki örnek kodla ilgili bir kod örneği verebilir misiniz?
— Daniel Beardsley

üzgünüm ama firavun faresi konusunda tecrübeli değilim. Sözdiziminin üstünde mongo sözdizimi var, bu yüzden herhangi bir dil için sürücünün bunu desteklediğini düşünüyorum. Bir örnek buldum, cevabımda kontrol et.
— Andrew Orsich

1

Bu kullanmak gibi bir yan problem olabilir mi?

function (user)

onun yerine

function(err, user)

bulmanın geri araması için? Zaten davam olduğu için bu konuda yardımcı olmaya çalışıyorum.


1

Mongoose belgesi düz bir javascript nesnesi DEĞİLDİR ve bu yüzden silme operatörünü kullanamazsınız. (Veya unset'lodash' kitaplığından).

Seçenekleriniz, doc.path = null || undefined veya mongoose belgesini düz nesneye dönüştürmek için Document.toObject () yöntemini kullanmak ve buradan her zamanki gibi kullanın. Mongoose api-ref'te daha fazlasını okuyun: http://mongoosejs.com/docs/api.html#document_Document-toObject

Örnek şuna benzer:

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

1

Deneyin:

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

  delete user.key_to_delete;

  user.save();
});

0

tüm bu cevaplarla ilgili sorun, tek bir alan için işe yaramasıdır. Örneğin, boş bir dizeyse tüm alanları Belgemden silmek istediğimi varsayalım "". Alan boş dize koydu eğer Öncelikle kontrol etmelisiniz $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

Koleksiyondan bir anahtarı çıkarmak istiyorsanız bu yöntemi deneyin. bu benim için çalıştı

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.