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

Вмъкване на масив в съществуващ документ

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

Вашият предишен PHP код е „блокиращ“, което означава, че всеки ред от код трябва да бъде завършен, преди да преминете към следващия ред от код. Това включва изчакване сървър на база данни да извърши актуализация и да върне отговора.

Не можете да използвате основни контролни цикли с функции вътре в тях, които се изпълняват асинхронно. Вместо това имате нужда от нещо, което може да извика следващата итерация на цикъла (или поне да сигнализира, че една итерация е завършена), след като асинхронната функция "update" действително е върнала резултат.

Втората точка тук е, че „нищо не е актуализирано“, защото не сте указали на функцията какво да актуализира или с какво да актуализира съответстващия документ.

Следното е аналогично на вашия оригинален PHP списък, но коригирано за "async" методи също използва async.eachSeries за контрол на цикъла от async библиотека:

async.eachSeries(
    tables,
    function(table,callback) {
        var tablename  = table.tablename;
        delete table.tablename;   // just remove the key rather than re-construct
        OutAccept.update(
            { "tablename": tablename },
            { "$push": { "inventar": table } },
            function(err,numAffected) {
                console.log( numAfftected ); // tells you how many are updated or nothing
                callback(err)
            }
        );
    },
    function(err) {
       // comes here on completion of all array items
    }
);

.findOneAndUpdate() командата вместо това връща документа, който е бил модифициран и с модификациите само ако ги поискате с { "new": true }

async.eachSeries(
    tables,
    function(table,callback) {
        var tablename  = table.tablename;
        delete table.tablename;
        OutAccept.findOneAndUpdate(
            { "tablename": tablename },
            { "$push": { "inventar": table } },
            { "new": true },
            function(err,doc) {
                console.log( doc ); // shows the modified document
                callback(err)
            }
        );
    },
    function(err) {
       // comes here on completion of all array items
    }
);

Ако искате да добавите няколко елемента от масив наведнъж или ако имате дори един елемент директно в масив, тогава използвайте $each модификатор на $push :

var inventor =  [
    {
        "ean": "2",
        "name": "name2",
        "runtime": "0",
        "art": "null",
        "marker": "null",
        "stammkost": "null",
        "accepted": "0"
    },
    {
        "ean": "1",
        "name": "name1",
        "runtime": "0",
        "art": "null",
        "marker": "null",
        "stammkost": "null",
        "accepted": "0"
    }
];


OutAccept.update(
    { "tablename": tablename },
    { "$push": { "inventar": { "$each": inventar } } },
    function(err,numAffected) {
       // work in here
    }
);



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. CRUD nodejs/express сървър:app.put req.body е празен

  2. Как да създадете TTL индекс на дълъг времеви печат в MongoDB

  3. Mongodb не стартира в ubuntu

  4. mongodb php получаване на уникални стойности на полета

  5. Mongodb намира, сравнявайки елементи от масив