एक MongoDB संग्रह में हर दस्तावेज़ में नया फ़ील्ड जोड़ें


334

मैं एक मौजूदा संग्रह में हर दस्तावेज़ में एक नया क्षेत्र कैसे जोड़ सकता हूं?

मुझे पता है कि किसी मौजूदा दस्तावेज़ के फ़ील्ड को कैसे अपडेट किया जाए, लेकिन संग्रह में हर दस्तावेज़ में नए फ़ील्ड को कैसे जोड़ा जाए। मैं इसे mongoशेल में कैसे कर सकता हूं ?

जवाबों:


598

मौजूदा संग्रह फ़ील्ड को अपडेट करने के समान है, $setयदि निर्दिष्ट फ़ील्ड मौजूद नहीं है तो एक नया फ़ील्ड जोड़ देगा।

इस उदाहरण को देखें:

> db.foo.find()
> db.foo.insert({"test":"a"})
> db.foo.find()
{ "_id" : ObjectId("4e93037bbf6f1dd3a0a9541a"), "test" : "a" }
> item = db.foo.findOne()
{ "_id" : ObjectId("4e93037bbf6f1dd3a0a9541a"), "test" : "a" }
> db.foo.update({"_id" :ObjectId("4e93037bbf6f1dd3a0a9541a") },{$set : {"new_field":1}})
> db.foo.find()
{ "_id" : ObjectId("4e93037bbf6f1dd3a0a9541a"), "new_field" : 1, "test" : "a" }

संपादित करें:

यदि आप अपने सभी संग्रह में एक नया_फ़ील्ड जोड़ना चाहते हैं, तो आपको सभी दस्तावेजों को अपडेट करने के लिए खाली चयनकर्ता का उपयोग करना होगा और सही (अंतिम परम) के लिए बहु ध्वज सेट करना होगा

db.your_collection.update(
  {},
  { $set: {"new_field": 1} },
  false,
  true
)

संपादित करें:

उपर्युक्त उदाहरण में पिछले 2 फ़ील्ड और झंडे false, trueनिर्दिष्ट करते हैं । upsertmulti

उपवाक्य: यदि सही पर सेट किया जाता है, तो कोई नया दस्तावेज़ बनाता है जब कोई दस्तावेज़ क्वेरी मापदंड से मेल नहीं खाता।

बहु: यदि सही पर सेट है, तो क्वेरी मापदंड को पूरा करने वाले कई दस्तावेजों को अपडेट करें। यदि गलत पर सेट किया गया है, तो एक दस्तावेज़ अपडेट करता है।

यह versionsपहले मानगो के लिए है 2.2। नवीनतम संस्करणों के लिए क्वेरी को थोड़ा बदल दिया जाता है

db.your_collection.update({},
                          {$set : {"new_field":1}},
                          {upsert:false,
                          multi:true}) 

7
क्या बिना मूल्य के बनाना संभव है
यासर अराफथ

7
db.your_collection.update ({}, {$ set: {"new_field": null}}, {upsert: false, multi: true})
नीलेश

1
क्या होगा अगर मैं एक खाली सरणी बनाना चाहता हूं?
प्रशांत पोखरियाल

3
@PrashantPokhriyal db.your_collection.update ({}, {$ सेट: { "new_field": []}}, {Upsert: झूठे, बहु: सच})
Máxima Alekz

3
क्या होगा यदि आप गतिशील रूप से निर्दिष्ट मूल्य के साथ नया क्षेत्र बनाना चाहते हैं? उदाहरण के लिए, मैं क्षेत्र new_fieldमें स्ट्रिंग की लंबाई के बराबर एक इंट होना चाहूंगा test
at१। को

3

स्पष्ट करने के लिए, वाक्य रचना MongoDB संस्करण 4.0.x के लिए निम्नानुसार है:

db.collection.update({},{$set: {"new_field*":1}},false,true)

यहाँ एक काम कर उदाहरण जोड़ने है लेख संग्रह में प्रकाशित क्षेत्र को और क्षेत्र के मूल्य को सही गया है :

db.articles.update({},{$set: {"published":true}},false,true)

0

पाइमोंगो 3.9+

update() अब पदावनत हो गया है और आप का उपयोग करना चाहिए replace_one(), update_one()या update_many()बजाय।

मेरे मामले में मैंने इस्तेमाल किया update_many() और इसने मेरी समस्या हल कर दी:

db.your_collection.update_many({}, {"$set": {"new_field": "value"}}, upsert=False, array_filters=None)

दस्तावेजों से

update_many(filter, update, upsert=False, array_filters=None, bypass_document_validation=False, collation=None, session=None)


filter: A query that matches the documents to update.

update: The modifications to apply.

upsert (optional): If True, perform an insert if no documents match the filter.

bypass_document_validation (optional): If True, allows the write to opt-out of document level validation. Default is False.

collation (optional): An instance of Collation. This option is only supported on MongoDB 3.4 and above.

array_filters (optional): A list of filters specifying which array elements an update should apply. Requires MongoDB 3.6+.

session (optional): a ClientSession.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.