我想切换一个对象内的布尔值,这是一个子文档,我很难更新数组中的特定对象。在Mongodb Aggregate的更新
文献:
"_id" : ObjectId("54afaabd88694dc019d3b628")
"Invitation" : [
{
"__v" : 0,
"ID" : ObjectId("54af6ce091324fd00f97a15f"),
"__t" : "USER",
"_id" : ObjectId("54b4ceb50fc380001bea1752"),
"Accepted" : false
},
{
"__v" : 0,
"ID" : ObjectId("54afac5412f5fdcc007a5c4d"),
"__t" : "USER",
"_id" : ObjectId("54b4cebe0fc380001bea1753"),
"Accepted" : false
}
],
控制器:
User.aggregate([{$match: {_id: ObjectId(54afaabd88694dc019d3b628)}},{$unwind: '$Invitation'},{$project: {_id: '$_id',Invitation: '$Invitation'}}],function(err,results){
function updateInvitation(_id){
var query = {'_id': _id, 'Invitation.ID': ObjectId("54af6ce091324fd00f97a15f")};
var operator = {$inc: {'Invitation.Accepted': 1}};
User.update(query,operator,{multi:true},function(err,updated){
if(err){
console.log(err);
}
console.log('updating'+updated);
});
}
res.jsonp(results);
updateInvitation(results[0]._id);
});
我试图使用$设置,但它没有制定出整个邀请阵列得到了与 '接受= 1' 取代 如何切换'接受'文档的字段NT特别是'ID'。
Invitation.$.Accepted
阵地操作者不列入适用于该字段包含阵列所以不能重复,以接受字段
编辑:
User.find({_id: req.user._id},'Invitation',function(err,docs){
if(err){
console.log(err);
}
console.log(docs);
var results = [];
async.each(docs,function(doc,err) {
if(err){
console.log('error'+ err);
}
async.each(docs.Invitation,function(invite,callback) {
console.log('second async');
User.update(
{ '_id': doc._id, 'Invitation._id': invite._id },
{ '$set': {'Invitation.$.Accepted': !invite.Accepted}},
function(err,doc) {
results.push(doc);
console.log('updated'+doc);
callback(err);
}
);
});
},function(err) {
if (err)
console.log(err);
console.log(results);
});
});
控制没有第二async.each内进入,错误是在第一次异步抛出这里是错误:
error-function() {
if (called) throw new Error("Callback was already called.");
called = true;
fn.apply(root, arguments);
}
谢谢你的回答,但我在async.each https:// github上得到这个错误。com/caolan/async/issues/610 –
@shaileshshekhawat这个问题是关于一个未定义的数组对象?那么哪个数组对象在这里没有定义? '.find()'的结果应该是返回文档或者查询是错误的。如果内部的“Invitation”数组未定义,那么您可以在提交给async.each之前测试该值。 –
@ NeilLunn -query查询'.find()'返回已经定义的邀请数组,我在'console.log(docs)'上测试过它,但仍然出现这个奇怪的错误 –