切换子文档的布尔值

时间:2015-01-20 09:52:33

标签: javascript node.js mongodb mongoose mongodb-query

我试图在一个数组内部切换布尔值,该数组是一个对象的集合,问题是该数组内的两个对象都触发了该字段,我只想为一个对象切换它。

文件:

"Invitation" : [ 
    {
        "__v" : 0,
        "ID" : ObjectId("54afaabd88694dc019d3b628"),
        "__t" : "USER",
        "_id" : ObjectId("54b5022b583973580c706784"),
        "Accepted" : false
    }, 
    {
        "__v" : 0,
        "ID" : ObjectId("54af6ce091324fd00f97a15f"),
        "__t" : "USER",
        "_id" : ObjectId("54bde39cdd55dd9016271f14"),
        "Accepted" : false
    }
]

控制器:

User.find({_id: req.user._id},'Invitation',function(err,docs) {
    if (err) {
        console.log(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)
                console.log(err);

            console.log('end'+results);
        });

});

更多

邀请数组中的ID字段是personId of person,让我们说 Bob David 发送邀请,所以在Invitation数组中有两个对象,这意味着我有来自两个不同的人的两个邀请,即(Bob和David)现在我只想接受Bob的邀请,所以当我接受Bob的邀请时,接受的字段应该被触发为Bob对象的 true 在数据库中,现在下面回答中显示的结果将两个对象都设置为 true ,其中我只希望接受的邀请为真。

当我接受只有一个用户/个人的邀请时,我发生了同样的事情。

1 个答案:

答案 0 :(得分:0)

我无法看到你声称的结果,这意味着它适用于我和世界其他地方。以下是删节列表作为单个脚本示例:

    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();
      });
    });

因此,可以根据要求清楚地“切换”两个值,并且完美运行。

这是我一次拍摄的结果:

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