sql >> Database teknologi >  >> NoSQL >> MongoDB

Skift boolesk værdi af underdokumenter

Jeg kan ikke se det resultat, du hævder, hvilket betyder, at det virker for mig og resten af ​​verden. Her er den forkortede liste som et enkelt script-eksempel:

    var async = require('async'),
        mongoose = require('mongoose'),
        Schema = mongoose.Schema;

    mongoose.connect('mongodb://localhost/test');

    var invitationSchema = new Schema({
      "ID": { "type": Schema.Types.ObjectId },
      "Accepted": Boolean
    });

    var userSchema = new Schema({
      "Invitation": [invitationSchema]
    });


    var User = mongoose.model( 'User', userSchema );

    User.find({},'Invitation',function(err,docs) {
      if (err) throw err;
      var results = [];

      async.each(docs,function(doc,callback) {
        async.each(doc.Invitation, function(invite,callback) {
          User.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) throw err;
        console.log( results.slice(-1)[0] );
        process.exit();
      });
    });

Så det "skifter" klart begge værdier som ønsket og fungerer perfekt.

Dette er resultatet fra mig på ét skud:

{ _id: 54be2f3360c191cf9edd7236,
  Invitation:
   [ { __v: 0,
       ID: 54afaabd88694dc019d3b628,
       __t: 'USER',
       _id: 54b5022b583973580c706784,
       Accepted: true },
     { __v: 0,
       ID: 54af6ce091324fd00f97a15f,
       __t: 'USER',
       _id: 54bde39cdd55dd9016271f14,
       Accepted: true } ] }



  1. Kan ikke bruge $multiply med Number

  2. Forespørgsel på dato for indlæg oprettet de sidste 24 timer

  3. Kan redis pipeline flere kommandoer, der afhænger af tidligere?

  4. Hvordan gemmer man en række objekter til mongoose DB med kun ét opkald?