মঙ্গোডিবিতে, আপনি কীভাবে একটি সূচি উপাদানটিকে এর সূচক দ্বারা সরিয়ে ফেলবেন?


97

নিম্নলিখিত উদাহরণে, ধরুন নথিটি db.people সংগ্রহের মধ্যে রয়েছে।

এটির সূচক দ্বারা আগ্রহের অ্যারের তৃতীয় উপাদান কীভাবে সরিয়ে নেওয়া যায় ?

{
  "_id" : ObjectId("4d1cb5de451600000000497a"),           
  "name" : "dannie",  
  "interests" : [  
    "guitar",  
    "programming",           
    "gadgets",  
    "reading"  
  ]   
}

এটি আমার বর্তমান সমাধান:

var interests = db.people.findOne({"name":"dannie"}).interests;  
interests.splice(2,1)  
db.people.update({"name":"dannie"}, {"$set" : {"interests" : interests}});

এর চেয়ে আরও সরল কোন উপায় আছে কি?


উত্তর:


139

অ্যারে সূচক দ্বারা টানা / অপসারণের সোজা উপায় নেই। আসলে, এটি একটি ওপেন ইস্যু http://jira.mongodb.org/browse/SERVER-1014 , আপনি এটির পক্ষে ভোট দিতে পারেন।

কর্মক্ষেত্রটি $ আনসেট এবং তারপরে $ পুল ব্যবহার করছে:

db.lists.update({}, {$unset : {"interests.3" : 1 }}) 
db.lists.update({}, {$pull : {"interests" : null}})

আপডেট: কিছু মন্তব্যে উল্লিখিত হিসাবে এই পদ্ধতিটি পারমাণবিক নয় এবং যদি অন্য ক্লায়েন্টরা দুটি অপারেশনের মধ্যে পড়েন এবং / অথবা লেখেন তবে কিছু বর্ণের শর্ত সৃষ্টি করতে পারে। পারমাণবিক হওয়ার জন্য যদি আমাদের অপারেশনটির প্রয়োজন হয় তবে আমরা করতে পারি:

  • ডাটাবেস থেকে নথিটি পড়ুন
  • দস্তাবেজটি আপডেট করুন এবং অ্যারেতে আইটেমটি সরান
  • ডাটাবেসে নথিকে প্রতিস্থাপন করুন। আমরা এটি পড়ার পর থেকে দস্তাবেজটি পরিবর্তিত হয়নি তা নিশ্চিত করতে, আমরা মঙ্গো ডক্সে বর্ণিত বর্তমান প্যাটার্নটি আপডেট করতে পারি

33
দেড় বছর কেটে গেল? এটি কি এখনও মঙ্গোদব দিয়ে জিনিসগুলির অবস্থা?
আবে

পরবর্তী উত্তরটি আরও সরাসরি এবং আমার পক্ষে কাজ করেছে। যদিও এটি সূচকে অপসারণ করছে না, বরং মান দ্বারা অপসারণ করছে।
বিশ

4
@ জাভিয়ার - আপনার সূচকে অবস্থান গণনা করার সময় এবং আপনি আনসেট না করা সময়ের মধ্যে যদি ডিবি পরিবর্তিত হয় তবে কী এই সমাধান আপনাকে সমস্যার সমাধান করতে দেবে না?
ক্রিক

এটি পারমাণবিক নয়, সুতরাং আপনার যদি অ্যারেতে নাল প্রবেশের সাথে মানিয়ে নিতে প্রস্তুত না এমন কোনও কোড থাকে তবে এটি অস্পষ্ট বর্ণের অবস্থার কারণ হতে পারে।
গ্লেন মেইনার্ড 21

4
8 বছর এবং এই টিকিটটি এখনও কার্যকর করা হয়নি ...
অলি জন

19

আপনি অ্যারেতে কোনও নির্দিষ্ট উপাদান অপসারণের জন্য অপারেশনটির $pullসংশোধক ব্যবহার করতে পারেন update। আপনি যদি কোনও জিজ্ঞাসা সরবরাহ করেছেন তবে এর মতো দেখতে পাবেন:

db.people.update({"name":"dannie"}, {'$pull': {"interests": "guitar"}})

এছাড়াও, আপনি $pullAllসমস্ত উপস্থিতি অপসারণ করার জন্য ব্যবহার বিবেচনা করতে পারেন । অফিসিয়াল ডকুমেন্টেশন পৃষ্ঠাতে এটি সম্পর্কে আরও - http://www.mongodb.org/display/DOCS/Updating#Updating-%24pull

এটি সূচকটিকে কোনও উপাদান অপসারণের মানদণ্ড হিসাবে ব্যবহার করে না, তবে এখনও আপনার অনুরূপ ক্ষেত্রে সহায়তা করতে পারে। আইএমও, অ্যারের অভ্যন্তরের উপাদানগুলিকে সম্বোধন করার জন্য সূচীগুলি ব্যবহার করা খুব নির্ভরযোগ্য নয় কারণ মঙ্গডব যত তাড়াতাড়ি আমি জানি ততই কোনও উপাদানগুলির অর্ডারে সামঞ্জস্য নয়।


6
তার উপাদানটি প্রশ্নের একটি অ্যারে। এই ক্ষেত্রে আদেশে মঙ্গো সামঞ্জস্যপূর্ণ। প্রকৃতপক্ষে, সমস্ত দস্তাবেজগুলি আসলে সংগ্রহের আদেশ দেওয়া হলেও অনেক ড্রাইভার এগুলি এগুলি পরিচালনা করে না। বিষয়টি আরও জটিল করে তুলতে, যদি কোনও আপডেট অপারেশনের পরে কোনও নথি সরানো হয় (প্যাডিং ফ্যাক্টরের বাইরে বৃদ্ধির কারণে) কীগুলির ক্রম হঠাৎ বর্ণমালা হয়ে যায় (কভারগুলির নীচে, আমি মনে করি যে তারা তাদের বাইনারি মান অনুসারে বাছাই করেছে, এই সন্দেহটি আমার জ্ঞানের উপর ভিত্তি করে যে অ্যারেগুলি কীগুলির সাথে স্ট্রিংগুলির পরিবর্তে ধারাবাহিক পূর্ণসংখ্যার সাথে বেশ মানক নথি))
মার্জ 75

এটি আনসেট + পুলের সমস্যাগুলি এড়ায়, তবে আপনার অভিধানটি কঠোরভাবে অর্ডার করা দরকার। বেশিরভাগ ভাষাগুলির অভিধানগুলি সীমানাবিহীন, তাই এটি ঘটতে ব্যথা হতে পারে।
গ্লেন মেইনার্ড

@ মারআর 75: আপনার কি রেফারেন্স আছে? মোঙ্গো নথিগুলি সর্বদা অর্ডার বজায় রাখার কথা, এবং যদি এটি কখনও সাব-ডকুমেন্টগুলিকে পুনরায় অর্ডার করে দেয় তবে অনেক কিছুই নষ্ট হয়ে যায়।
গ্লেন মেইনার্ড

আমার কাছে রেফারেন্স নেই। আমি এটি ২.২ এর সাথে ব্যক্তিগত অভিজ্ঞতা থেকে জানি, আপডেটযুক্ত এবং সরানো নথির দ্বারা প্রবর্তিত স্থির বাগ থাকা। আমি গত কয়েকমাসে খুব বেশি মঙ্গো কাজ করিনি তাই আমি আরও বর্তমান সংস্করণে কথা বলতে পারি না।
মার্চ 75

যতক্ষণ পর্যন্ত এলিমেন্টের ধারাবাহিকতা রয়েছে, আমার কাঙ্ক্ষিত ব্যবহারের ক্ষেত্রে এটি রয়েছে। কোনও ক্লায়েন্ট মোঙ্গোর কাছ থেকে জসনকে অনুরোধ করে এবং তারপরে যদি ক্লায়েন্ট কোনও জসন অ্যারে থেকে কোনও আইটেম 'মুছুন' বলে বেছে নেয়, এটি মুছে ফেলার জন্য অ্যারের সূচকটি সার্ভারে প্রেরণ করবে। যদি অ্যারের আইটেমগুলির অবস্থান সরানো থাকে তবে তা অদ্ভুত হবে তবে তারা কেন বৈশিষ্ট্যটি প্রয়োগ করতে পারে না তা ব্যাখ্যা করবে
নর্থস্ট্রাইডার

4

আনসেটটি ব্যবহার না করে (স্বীকৃত উত্তরের মতো), আমি ক্ষেত্রটিকে একটি অনন্য মান (অর্থাত্ NULL নয়) সেট করে এবং তারপরে তত্ক্ষণাত সেই মানটি টান দিয়ে সমাধান করি। অ্যাসিচ দৃষ্টিকোণ থেকে কিছুটা নিরাপদ। কোডটি এখানে:

    var update = {};
    var key = "ToBePulled_"+ new Date().toString();
    update['feedback.'+index] = key;
    Venues.update(venueId, {$set: update});
    return Venues.update(venueId, {$pull: {feedback: key}});

আশা করি মোঙ্গো এটিকে মোকাবেলা করবে, সম্ভবত $ পজ পাশাপাশি সমর্থন করতে পজিশন সংশোধককে প্রসারিত করে।


2

আমি একটি জিইউডি (আমি অবজেক্টআইডি ব্যবহার করার ঝোঁক) ক্ষেত্র, বা অ্যারের প্রতিটি সাব-ডকুমেন্টের জন্য একটি স্বয়ংক্রিয়-বৃদ্ধি ক্ষেত্র ব্যবহার করার পরামর্শ দেব।

এই জিইউইডিটির সাহায্যে একটি টানা ইস্যু করা সহজ এবং নিশ্চিত হয়ে নিন যে সঠিকটি টানা হবে। একই অন্যান্য অ্যারে অপারেশন জন্য যায়।


2

শুরু করে Mongo 4.4, $functionসমষ্টি অপারেটরটি মঙ্গোডিবি ক্যোরি ভাষা সমর্থন করে না এমন আচরণ বাস্তবায়নের জন্য একটি কাস্টম জাভাস্ক্রিপ্ট ফাংশন প্রয়োগ করার অনুমতি দেয়।

উদাহরণস্বরূপ, প্রদত্ত সূচকে কোনও উপাদান সরিয়ে একটি অ্যারে আপডেট করার জন্য:

// { "name": "dannie", "interests": ["guitar", "programming", "gadgets", "reading"] }
db.collection.update(
  { "name": "dannie" },
  [{ $set:
    { "interests":
      { $function: {
          body: function(interests) { interests.splice(2, 1); return interests; },
          args: ["$interests"],
          lang: "js"
      }}
    }
  }]
)
// { "name": "dannie", "interests": ["guitar", "programming", "reading"] }

$function 3 পরামিতি লাগে:

  • body, যা প্রয়োগ করার ফাংশন, যার প্যারামিটারটি সংশোধন করার জন্য অ্যারে। এখানে ফাংশনটি কেবল সূচক 2 এ 1 উপাদানটি সরাতে স্প্লাইস ব্যবহার করে।
  • args, যা bodyফাংশনটি প্যারামিটার হিসাবে নেয় এমন রেকর্ড থেকে ক্ষেত্রগুলি অন্তর্ভুক্ত করে । আমাদের ক্ষেত্রে "$interests"
  • lang, যা ভাষায় bodyফাংশনটি লেখা হয়। শুধুমাত্র jsবর্তমানে উপলব্ধ।

2

মংডোব ৪.২ এ আপনি এটি করতে পারেন:

db.example.update({}, [
     {$set: {field: {
           $concatArrays: [ 
                  {$slice: ["$field", P]}, 
                  {$slice: ["$field", {$add: [1, P]}, {$size: "$field"}]}
           ]
     }}}
]);

পি আপনি অ্যারে থেকে মুছতে চান এমন উপাদানগুলির সূচক।

আপনি পি থেকে শেষ অবধি সরাতে চাইলে:

db.example.update({}, [
     {$set: {field: {$slice: ["$field", P]}}
]);

0

নোডেজ সহ মঙ্গু ব্যবহার করে উত্তর সন্ধানকারী লোকদের জন্য। এইভাবেই আমি এটি করি।

exports.deletePregunta = function (req, res) {
let codTest = req.params.tCodigo;
let indexPregunta = req.body.pregunta; // the index that come from frontend
let inPregunta = `tPreguntas.0.pregunta.${indexPregunta}`; // my field in my db
let inOpciones = `tPreguntas.0.opciones.${indexPregunta}`; // my other field in my db
let inTipo = `tPreguntas.0.tipo.${indexPregunta}`; // my  other field in my db

Test.findOneAndUpdate({ tCodigo: codTest },
    {
        '$unset': {
            [inPregunta]: 1, // put the field with [] 
            [inOpciones]: 1,
            [inTipo]: 1
        }
    }).then(()=>{ 
    Test.findOneAndUpdate({ tCodigo: codTest }, {
        '$pull': {
            'tPreguntas.0.pregunta': null,
            'tPreguntas.0.opciones': null,
            'tPreguntas.0.tipo': null
        }
    }).then(testModificado => {
        if (!testModificado) {
            res.status(404).send({ accion: 'deletePregunta', message: 'No se ha podido borrar esa pregunta ' });
        } else {
            res.status(200).send({ accion: 'deletePregunta', message: 'Pregunta borrada correctamente' });
        }
    })}).catch(err => { res.status(500).send({ accion: 'deletePregunta', message: 'error en la base de datos ' + err }); });
 }

আমি যদি এই উত্তরটি খুব ভাল বুঝতে না পারি তবে আমি এই উত্তরটি আবারও লিখতে পারি, তবে আমি মনে করি ঠিক আছে।

আশা করি এটি আপনাকে সহায়তা করবে, আমি এই সমস্যার মুখোমুখি হয়ে অনেক সময় হারিয়েছি।


-3

এর সূচক দ্বারা অ্যারেতে উপাদানগুলি সরানোর জন্য আমরা $ পুল ব্যবহার করতে পারি $ পপ ব্যবহার করতে পারি। সূচকের উপর ভিত্তি করে অপসারণের জন্য আপনার সূচী অবস্থান থেকে 1 বিয়োগ করা উচিত।

উদাহরণস্বরূপ, যদি আপনি সূচক 0-তে উপাদানটি সরিয়ে নিতে চান তবে আপনার -1 ব্যবহার করা উচিত, সূচি 1 এর জন্য আপনার 0 এবং আরও কিছু ব্যবহার করা উচিত ...

তৃতীয় উপাদান (গ্যাজেট) সরানোর জন্য প্রশ্ন:

db.people.update({"name":"dannie"}, {'$pop': {"interests": 1}})

রেফারেন্সের জন্য: https://docs.mongodb.com/manual/references/operator/update/pop/


4
লিঙ্কযুক্ত ডকুমেন্টেশন অনুসারে $popঅ্যারে থেকে কেবল প্রথম বা শেষ উপাদানটি সরাতে পারে। এই উত্তরের ক্যোয়ারী তৃতীয় উপাদানটিকে সরাবে না।
ট্র্যাভিস জি।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.