MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

अगर प्रविष्टि में मेल खाने वाले दो फ़ील्ड नहीं हैं तो mongo नेस्टेड सरणी में जोड़ें

एक परमाणु अद्यतन के साथ संभव नहीं है, मुझे डर है, आपको कुछ अपडेट ऑपरेशंस करना होगा जो दोनों स्थितियों को पूरा करते हैं।

अपडेट लॉजिक को दो अलग-अलग अपडेट ऑपरेशंस में विभाजित करें, पहले वाले को स्थितीय $ ऑपरेटर history में तत्व की पहचान करने के लिए सरणी जो आप चाहते हैं और $set मौजूदा क्षेत्रों को अद्यतन करने के लिए। यह कार्रवाई तर्क का पालन करती है यदि नाम और संगठन मेल खाता है तो फ़ील्ड अपडेट करें

अब, आप findAndModify() इस ऑपरेशन के लिए विधि क्योंकि यह अद्यतन दस्तावेज़ वापस कर सकता है। डिफ़ॉल्ट रूप से, लौटाए गए दस्तावेज़ में अद्यतन पर किए गए संशोधन शामिल नहीं होते हैं।

तो, इस शस्त्रागार से लैस होकर, आप अगले ऑपरेशन में अपने दूसरे तर्क की जांच कर सकते हैं यानी अपडेट करें यदि "history.name" और "history.organisation" का संयोजन सरणी में मौजूद नहीं है उन्हें> . इस दूसरे अपडेट ऑपरेशन के साथ, आपको $push तत्वों को जोड़ने के लिए ऑपरेटर।

निम्नलिखित उदाहरण उपरोक्त अवधारणा को प्रदर्शित करता है। यह शुरू में मानता है कि आपके पास क्वेरी भाग और दस्तावेज़ को अलग-अलग ऑब्जेक्ट्स के रूप में अपडेट किया जाना है।

उदाहरण के लिए, जब हमारे पास मौजूदा इतिहास सरणी से मेल खाने वाले दस्तावेज़ हैं, तो यह केवल एक अद्यतन कार्रवाई करेगा, लेकिन यदि दस्तावेज़ मेल नहीं खाते हैं, तो findAndModify() विधि शून्य वापस आ जाएगी, दस्तावेज़ को सरणी में धकेलने के लिए अपने दूसरे अपडेट ऑपरेशन में इस तर्क का उपयोग करें:

var doc = {
        "name": "Test123",
        "organisation": "Rat"
    }, // document to update. Note: the doc here matches the existing array
    query = { "email": "example@sqldat.com" }; // query document

query["history.name"] = doc.name; // create the update query
query["history.organisation"] = doc.organisation;
var update = db.users.findAndModify({
    "query": query,
    "update": { 
        "$set": { 
            "history.$.name": doc.name,
            "history.$.organisation": doc.organisation
        }
    }
}); // return the document modified, if there's no matched document update = null

if (!update) {
    db.users.update(
        { "email": query.email },
        { "$push": { "history": doc } }
    );
}

मेल खाने वाले दस्तावेज़ों के लिए इस ऑपरेशन के बाद, संग्रह को क्वेरी करने से वही मिलेगा

db.users.find({ "email": "example@sqldat.com" });

आउटपुट:

{
    "_id" : ObjectId("575fe85bfe98c1fba0a6e535"),
    "email" : "example@sqldat.com",
    "__v" : 0,
    "history" : [ 
        {
            "name" : "Test123",
            "organisation" : "Rat",
            "field" : 4,
            "another" : 3
        }
    ]
}

अब उन दस्तावेज़ों पर विचार करें जो मेल नहीं खाएंगे:

var doc = {
        "name": "foo",
        "organisation": "bar"
    }, // document to update. Note: the doc here does not matches the current array
    query = { "email": "example@sqldat.com" }; // query document

query["history.name"] = doc.name; // create the update query
query["history.organisation"] = doc.organisation;
var update = db.users.findAndModify({
    "query": query,
    "update": { 
        "$set": { 
            "history.$.name": doc.name,
            "history.$.organisation": doc.organisation
        }
    }
}); // return the document modified, if there's no matched document update = null

if (!update) {
    db.users.update(
        { "email": query.email },
        { "$push": { "history": doc } }
    );
}

इस दस्तावेज़ के लिए इस संग्रह को क्वेरी करना

db.users.find({ "email": "example@sqldat.com" });

उपज होगा

आउटपुट:

{
    "_id" : ObjectId("575fe85bfe98c1fba0a6e535"),
    "email" : "example@sqldat.com",
    "__v" : 0,
    "history" : [ 
        {
            "name" : "Test123",
            "organisation" : "Rat",
            "field" : 4,
            "another" : 3
        }, 
        {
            "name" : "foo",
            "organisation" : "bar"
        }
    ]
}



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. रेल और मोंगोइड के साथ गतिशील गुण

  2. डेटाबेस चुनने के बाद प्रमाणित करें

  3. एक संग्रह के भीतर एक संग्रह

  4. आश्चर्य:क्या MongoDB _id डिफ़ॉल्ट रूप से अद्वितीय है?

  5. PHP में मोंगो डीबी $ या क्वेरी