Bir alanı bir MongoDB belgesinden tamamen nasıl kaldırırım?


307
{ 
    name: 'book',
    tags: {
        words: ['abc','123'],
        lat: 33,
        long: 22
    }
}

Bunun bir belge olduğunu varsayalım. wordsBu koleksiyondaki tüm dokümanlardan " " tamamen nasıl kaldırırım ? Tüm belgelerin " words" olmadan olmasını istiyorum :

 { 
     name: 'book',
     tags: {
         lat: 33,
         long: 22
     }
}

Yanıtlar:


532

Bunu deneyin: Koleksiyonunuz 'örnek' ise

db.example.update({}, {$unset: {words:1}}, false, true);

Şuna bakın:

http://www.mongodb.org/display/DOCS/Updating#Updating-%24unset

GÜNCELLEME :

Yukarıdaki bağlantı artık '$ unset' işlemini kapsamıyor. {multi: true}Bu alanı koleksiyondaki tüm belgelerden kaldırmak istiyorsanız eklediğinizden emin olun ; aksi takdirde, yalnızca eşleşen ilk belgeden kaldırılır. Güncellenmiş belgeler için buna bakın:

https://docs.mongodb.com/manual/reference/operator/update/unset/

Misal:

db.example.update({}, {$unset: {words:1}} , {multi: true});


1
Artık bu sayfada "Nic Cottrell" tarafından yapılmış bir yorum yok :)
Dan Dascalescu

6
Bir şey mi kaçırıyorum, yoksa 8 yıldan fazla bir süredir yanlış mı , çünkü tags.wordsolmalı $unset, değil wordsmi? Salvador Dali'nin cevabına da bakınız.
Dan Dascalescu

1
Bunun updateManyyerine kullanabilirsiniz {multi:true}, yanidb.example.updateMany({},{"$unset":{words:""}})
Kip

158

Başlangıçta, sorunun neden bir ödülü olduğunu anlamadım (sorunun güzel bir cevabı olduğunu ve eklenecek bir şey olmadığını düşündüm), ancak daha sonra 15 kez kabul edilen ve iptal edilen cevabın gerçekten yanlış olduğunu fark ettim!

Evet, $unsetişleci kullanmanız gerekir , ancak bu ayar, bir koleksiyona ait belge için var olmayan kelime anahtarını kaldıracaktır. Temelde hiçbir şey yapmaz.

Bu yüzden Mongo'ya belge etiketlerine ve sonra nokta gösterimini kullanarak sözcüklere bakmasını söylemeniz gerekir . Yani doğru sorgu.

db.example.update(
  {},
  { $unset: {'tags.words':1}},
  false, true
)

Sadece tamamlama uğruna, bunu yapmanın başka bir yoluna atıfta bulunacağım , bu çok daha kötüdür, ancak bu şekilde alanı herhangi bir özel kodla (bu belgedeki başka bir alana dayanarak bile) değiştirebilirsiniz.


2
Buna ek olarak, etiketler bir dizi ise şu şekilde olur: db.example.update ({}, {$ unset: {'tags. $ []. Words': 1}}, false, true)
Manan Şah

21
db.example.updateMany({},{"$unset":{"tags.words":1}})

Bunu birden çok belgeyi güncellemek için de kullanabiliriz.


2
Ben false, trueson iki argümanlar olarak geçen daha net buluyorumupdate()
Kip

17

MongoDB'deki alanı kaldırmak veya silmek için

  • Tek Kayıt için

    db.getCollection('userData').update({}, {$unset: {pi: 1}})
  • Çoklu Kayıt için

    db.getCollection('userData').update({}, {$unset: {pi: 1}}, {multi: true})

2

Buna benzer bir şey yapmaya çalışıyordum, ancak bunun yerine gömülü bir belgeden sütunu kaldırdım. Bir çözüm bulmak biraz zaman aldı ve bu ilk karşılaştığım gönderiydi, bu yüzden aynı şeyi yapmaya çalışan herkes için buraya göndereceğimi düşündüm.

Diyelim ki verileriniz şöyle görünüyor:

{ 
  name: 'book',
  tags: [
    {
      words: ['abc','123'],
      lat: 33,
      long: 22
    }, {
      words: ['def','456'],
      lat: 44,
      long: 33
    }
  ]
}

Sütunu wordskatıştırılmış belgeden kaldırmak için şunu yapın :

db.example.update(
  {'tags': {'$exists': true}},
  { $unset: {'tags.$[].words': 1}},
  {multi: true}
)

veya kullanarak updateMany

db.example.updateMany(
  {'tags': {'$exists': true}},
  { $unset: {'tags.$[].words': 1}}
)

$unsetDeğeri varsa sadece düzenlemek olacaktır ancak (eğer kontrol alışkanlık güvenli bir navigasyon yapmayacağım tagsgömülü belge üzerinde gerekli olan Varlığından bu yüzden ilk var).

Bu, 3.6 sürümünde tanıtılan tüm konumlandırma işlecini ( $[]) kullanır


1

Varsayılan olarak, update () yöntemi tek bir belgeyi güncelleştirir. Sorgu ölçütleriyle eşleşen tüm belgeleri güncellemek için Çoklu Parametreyi ayarlayın.

3.6 sürümünde değiştirildi. Sözdizimi:

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ]
   }
)

Misal :

db.getCollection('products').update({},{$unset: {translate:1, qordoba_translation_version:1}}, {multi: true})

Örneğinizde:

db.getCollection('products').update({},{$unset: {'tags.words' :1}},  {multi: true})

1

İlk olarak Mongo 4.2, biraz farklı bir sözdizimi kullanmak da mümkündür:

// { name: "book", tags: { words: ["abc", "123"], lat: 33, long: 22 } }
db.collection.update({}, [{ $unset: ["tags.words"] }], { many: true })
// { name: "book", tags: { lat: 33, long: 22 } }

Güncelleştirme ayrıca toplama boru hattını kabul edebilir yöntemi (bir toplanma boru hattının kullanılmasını belirten kare parantez unutmayın).

Bu $unset, kullanılan operatörün , sözdizimi bir alan dizisi alan birleştirme ( "sorgu" sorgusu yerine) olduğu anlamına gelir .


1

PyMongo (Python mongo) için çözüm:

db.example.update({}, {'$unset': {'tags.words':1}}, multi=True);

0

Ve mongomapper için,

  • Belge: Kapatma
  • Kaldırılacak alan: shutoff_type

Shutoff.collection.update( {}, { '$unset' => { 'shutoff_type': 1 } }, :multi => true )


0

MongoEngine kullanarak bir alanı kaldırmak için bir yol ararken bu sayfayı bulmaya devam ettiğim için, burada da MongoEngine yolunu göndermek için yararlı olabilir sanırım:

Example.objects.all().update(unset__tags__words=1)

-2

{name: 'book', etiketler: {words: ['abc', '123'], lat: 33, uzun: 22}}

Ans:

db.tablename.remove ({ 'tags.words': [ 'ABC', '123']})


-3

"Kelimeler" olup olmadığını kontrol etme ve ardından belgeden kaldırma

    db.users.update({"tags.words" :{$exists: true}},
                                           {$unset:{"tags.words":1}},false,true);

true, eşleşirse birden çok belgenin güncellenmesini gösterir.


Varlığını kontrol etmenize gerek yok. Belgelerine durumları şu: "alanına yoksa, hiçbir şey (yani hiçbir işlem) yapar ayarlanmazsa sonra $."
Dan Dascalescu

-4

3.4'teki projeyi kullanarak bunu toplu olarak da yapabilirsiniz

{$ project: {"tags.words": 0}}


-7

Bir pakete başvurmak ve çeşitli "anahtarları" kaldırmak için şunu deneyin

db['name1.name2.name3.Properties'].remove([
{
     "key" : "name_key1"
},
{
     "key" : "name_key2"
},
{
     "key" : "name_key3"
}
)]
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.