sql >> Database >  >> NoSQL >> MongoDB

Update over Aggregate in Mongodb

Ik denk echt niet dat zelfs als een feeder-query het aggregatieraamwerk de juiste bewerking is om hier te gebruiken. Het enige dat u doet, is de array "denormaliseren" als afzonderlijke documenten. Zou eigenlijk niet nodig moeten zijn. Haal gewoon het document op:

var query = {}; // whatever criteria

Users.find(query,"Invitation",function(err,docs) {
    if (err) {
        console.log(err);

    var results = [];        

    async.each(docs,function(doc,callback) {
        async.each(docs.Invitation,function(invite,callback) {
            Users.findOneAndUpdate(
                { "_id": doc._id, "Invitation._id": invite._id },
                { "$set": { "Invitation.$.Accepted": !invite.Accepted } },
                function(err,doc) {
                   results.push( doc );
                   callback(err);
                }
            );
        },callback);
    },function(err) {
        if (err)
            console.log(err);

        console.log(results);
    });    

});

Het is dus geen probleem om de lijst met documenten te herhalen in een reactie op wat u aan het doen bent, het is alleen dat u ook de arrayleden wilt herhalen. De vangst is bij het uitgeven van een soort .update() dat u moet weten, dan is de asynchrone oproep voltooid.

Dus ik gebruik async.each maar je wilt waarschijnlijk async.eachLimit om de loop te regelen. De matching van het element komt van de positionele $ operator, die overeenkomt met het overeenkomende array-element in de query.

Het is gewoon JavaScript-code, dus "wissel" de waarde gewoon met !invite.accepted die het zal omkeren. Retourneer voor nog meer plezier de array "results" door het gewijzigde document van .findOneAndUpdate() .



  1. Hoe laat ik een MongoDB-database van de opdrachtregel vallen?

  2. Mongodb Join op _id veld van String naar ObjectId

  3. hoe _id veld te beheren bij gebruik van POCO met mongodb c# driver

  4. Hoofdletterongevoelig sorteren in MongoDB