sql >> Databasteknik >  >> NoSQL >> MongoDB

Uppdatera med uttryck istället för värde

Jag stötte precis på detta när jag sökte efter MongoDB-motsvarigheten till SQL så här:

update t
set c1 = c2
where ...

Sergio har rätt i att du inte kan referera till en annan egenskap som ett värde i en rak uppdatering. Men db.c.find(...) returnerar en markör och den markören har en forEach metod :

Så du kan säga sådant här:

db.QUESTIONS.find({}, {_id: true, i_up: true, i_down: true}).forEach(function(q) {
    db.QUESTIONS.update(
        { _id: q._id },
        { $set: { i_pp: q.i_up * 100 - q.i_down * 20 } }
    );
});

att uppdatera dem en i taget utan att lämna MongoDB.

Om du använder en drivrutin för att ansluta till MongoDB så borde det finnas något sätt att skicka en JavaScript-sträng till MongoDB; till exempel med Ruby-drivrutinen skulle du använda eval :

connection.eval(%q{
    db.QUESTIONS.find({}, {_id: true, i_up: true, i_down: true}).forEach(function(q) {
        db.QUESTIONS.update(
            { _id: q._id },
            { $set: { i_pp: q.i_up * 100 - q.i_down * 20 } }
        );
    });
})

Andra språk bör vara liknande.



  1. Indexering av array/subobjekt i mongoDB orsakar duplicate key error

  2. Tidsfel i mongo-skal

  3. 2 sätt att ta bort en databas i MongoDB

  4. db.collection är inte en funktion när du använder MongoClient v3.0