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.