วิธีลบเขตข้อมูลอย่างสมบูรณ์จากเอกสาร MongoDB?


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

สมมติว่านี่เป็นเอกสาร ฉันจะลบ " words" ออกจากเอกสารทั้งหมดในคอลเล็กชันนี้ได้อย่างไร ฉันต้องการให้เอกสารทั้งหมดไม่มี " words":

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

คำตอบ:


531

ลองสิ่งนี้: หากคอลเล็กชันของคุณเป็น 'ตัวอย่าง'

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

แนะนำสิ่งนี้:

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

อัปเดต :

ลิงค์ด้านบนไม่ครอบคลุม '$ unset'ing อีกต่อไป อย่าลืมเพิ่ม{multi: true}ถ้าคุณต้องการลบฟิลด์นี้จากเอกสารทั้งหมดในคอลเล็กชัน มิฉะนั้นจะลบออกจากเอกสารแรกที่พบว่าตรงกัน ดูสิ่งนี้สำหรับเอกสารที่อัปเดตแล้ว:

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

ตัวอย่าง:

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

1
ดูคำตอบสำหรับคำถามนี้สำหรับคำอธิบายของ false / true stackoverflow.com/questions/7714216/…
Dsel

1
ไม่มีความคิดเห็นอีกต่อไปโดย "Nic Cottrell" ที่ใดก็ได้ในหน้านี้ :)
Dan Dascalescu

6
ฉันทำบางสิ่งบางอย่างผิดพลาดหรือเกิดความผิดพลาดมา 8 ปีแล้วเพราะtags.wordsควรเป็น$unsetเช่นนั้นไม่ใช่wordsหรือ? ดูคำตอบของ Salvador Dali
Dan Dascalescu

1
คุณสามารถใช้updateManyแทนได้{multi:true}เช่นdb.example.updateMany({},{"$unset":{words:""}})
Kip

158

ในตอนแรกฉันไม่เข้าใจว่าทำไมคำถามถึงได้รับรางวัล (ฉันคิดว่าคำถามนั้นมีคำตอบที่ดีและไม่มีอะไรให้เพิ่ม) แต่จากนั้นฉันสังเกตเห็นว่าคำตอบที่ตอบรับและ upvoted 15 ครั้งนั้นผิดจริงๆ!

ใช่คุณต้องใช้$unsetโอเปอเรเตอร์แต่การตั้งค่านี้จะลบคีย์คำที่ไม่มีอยู่สำหรับเอกสารสำหรับคอลเลกชัน ดังนั้นโดยทั่วไปมันจะไม่ทำอะไรเลย

ดังนั้นคุณต้องบอก Mongo เพื่อดูในแท็กเอกสารและแล้วในคำโดยใช้สัญกรณ์ dot ดังนั้นการค้นหาที่ถูกต้องคือ

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

เพียงเพื่อความสมบูรณ์ฉันจะอ้างถึงวิธีอื่นในการทำซึ่งแย่กว่ามาก แต่วิธีนี้คุณสามารถเปลี่ยนฟิลด์ด้วยรหัสที่กำหนดเองใด ๆ (แม้จะอ้างอิงจากฟิลด์อื่นจากเอกสารนี้)


2
นอกจากนี้หากแท็กเป็นอาร์เรย์ดังนั้นมันจะเป็นดังนี้: db.example.update ({}, {$ unset: {'แท็ก. $ []. คำ': 1}}, เท็จ, จริง)
Manan Shah

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

นอกจากนี้เรายังสามารถใช้สิ่งนี้เพื่ออัปเดตหลายเอกสาร


2
ฉันพบว่าชัดเจนกว่าการผ่านfalse, trueเมื่อสองคนสุดท้ายไปupdate()
คิ

17

หากต้องการลบหรือลบฟิลด์ใน MongoDB

  • สำหรับบันทึกเดียว

    db.getCollection('userData').update({}, {$unset: {pi: 1}})
  • สำหรับ Multi Record

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

2

ฉันพยายามทำสิ่งที่คล้ายกับสิ่งนี้ แต่แทนที่จะลบคอลัมน์ออกจากเอกสารฝังตัว ฉันใช้เวลาสักครู่เพื่อค้นหาวิธีแก้ปัญหาและนี่เป็นโพสต์แรกที่ฉันพบดังนั้นฉันคิดว่าฉันจะโพสต์ที่นี่สำหรับคนอื่นที่พยายามทำเช่นเดียวกัน

ดังนั้นสมมติว่าข้อมูลของคุณมีลักษณะดังนี้:

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

ในการลบคอลัมน์wordsออกจากเอกสารฝังตัวให้ทำดังนี้

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

หรือใช้ updateMany

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

$unsetเท่านั้นที่จะแก้ไขได้ถ้าค่าที่มีอยู่ แต่ก็จะไม่ทำการนำปลอดภัย (มันเคยชินตรวจสอบว่าtagsมีอยู่ครั้งแรก) เพื่อให้อยู่เป็นสิ่งจำเป็นในเอกสารที่ฝังตัว

สิ่งนี้ใช้โอเปอเรเตอร์ตำแหน่งทั้งหมด ( $[]) ซึ่งเปิดตัวในเวอร์ชั่น 3.6


1

โดยค่าเริ่มต้นเมธอด update () จะอัพเดตเอกสารเดียว ตั้งค่าพารามิเตอร์หลายพารามิเตอร์เพื่อปรับปรุงเอกสารทั้งหมดที่ตรงกับเกณฑ์แบบสอบถาม

เปลี่ยนเป็นเวอร์ชั่น 3.6 ไวยากรณ์:

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

ตัวอย่าง:

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

ในตัวอย่างของคุณ:

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

1

เริ่มต้นMongo 4.2ก็เป็นไปได้ที่จะใช้ไวยากรณ์ที่แตกต่างกันเล็กน้อย:

// { 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 } }

ปรับปรุงวิธีการยังสามารถยอมรับท่อรวม (หมายเหตุวงเล็บ Squared signifying ใช้ท่อสรุปรวม)

ซึ่งหมายความว่า$unsetโอเปอเรเตอร์ที่ใช้คือการรวมอันหนึ่ง (ตรงข้ามกับ"เคียวรี" อันเดียว ) ซึ่งไวยากรณ์ใช้อาร์เรย์ของฟิลด์



0

และสำหรับ mongomapper

  • เอกสาร: ปิดเครื่อง
  • ฟิลด์ที่จะลบ: shutoff_type

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


0

เนื่องจากฉันยังคงค้นหาหน้านี้เมื่อค้นหาวิธีลบเขตข้อมูลโดยใช้ MongoEngine ฉันจึงคิดว่าการโพสต์วิธี MongoEngine อาจมีประโยชน์เช่นกัน:

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


-3

ตรวจสอบว่ามี "คำ" อยู่หรือไม่จากนั้นนำออกจากเอกสาร

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

true ระบุว่าอัพเดตหลายเอกสารหากตรงกัน


คุณไม่จำเป็นต้องตรวจสอบการมีอยู่ รัฐเอกสารว่า "ถ้าเขตไม่ได้อยู่แล้ว $ ล้างไม่ทำอะไรเลย (คือไม่มีการดำเนินการ)."
Dan Dascalescu


-7

หากต้องการอ้างอิงแพ็คเกจและลบ "คีย์" ต่างๆลองใช้สิ่งนี้

db['name1.name2.name3.Properties'].remove([
{
     "key" : "name_key1"
},
{
     "key" : "name_key2"
},
{
     "key" : "name_key3"
}
)]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.