MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да изтегля един екземпляр на елемент в масив в MongoDB?

Значи си прав в това, че $pull операторът прави точно това, което се казва в документацията, тъй като неговите аргументи всъщност са „заявка“, използвана за съвпадение на елементите, които трябва да бъдат премахнати.

Ако съдържанието на вашия масив винаги има елемента на "първа" позиция, както показвате, тогава $pop операторът всъщност премахва този първи елемент.

С основния драйвер за възел:

collection.findOneAndUpdate(
    { "array.0": "bird" },       // "array.0" is matching the value of the "first" element 
    { "$pop": { "array": -1 } },
    { "returnOriginal": false },
    function(err,doc) {

    }
);

С mongoose аргументът за връщане на модифицирания документ е различен:

MyModel.findOneAndUpdate(
    { "array.0": "bird" },
    { "$pop": { "array": -1 } },
    { "new": true },
    function(err,doc) {

    }
);

Но нито един от тях не е от голяма полза, ако позицията на масива на „първия“ елемент за премахване не е известна.

За общия подход тук се нуждаете от „две“ актуализации, като едната да съответства на първия елемент и да го замените с нещо уникално, което да бъде премахнато, а второто действително да премахне този модифициран елемент.

Това е много по-просто, ако се прилагат прости актуализации и не се иска върнатият документ, а също така може да се направи групово в различни документи. Също така помага да използвате нещо като async.series, за да избегнете вмъкването на вашите обаждания:

async.series(
    [
        function(callback) {
            collection.update(
                { "array": "bird" },
                { "$unset": { "array.$": "" } },
                { "multi": true }
                callback
            );
        },
       function(callback) {
           collection.update(
                { "array": null },
                { "$pull": { "array": null } },
                { "multi": true }
                callback
           );
       }
    ],
    function(err) {
       // comes here when finished or on error   
    }
);

Така че с помощта на $unset тук с позиционния $ оператор позволява на "първия" елемент да бъде променен на null . След това последващата заявка с $pull просто премахва всеки null запис от масива.

По този начин можете безопасно да премахнете "първото" появяване на стойност от масив. Да се ​​определи дали този масив съдържа повече от една стойност, която е една и съща, е друг въпрос.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB $round срещу $trunc:Каква е разликата?

  2. MongoDB $replaceAll

  3. Как да получа масив от колекцията mongoDB?

  4. Съвети за стартиране на MongoDB в производството с помощта на потоци за промяна

  5. Обвивката на MongoDB и сървърът не съвпадат