부울 값을 하위 문서로 토글하려고하는데 배열 내의 특정 개체를 업데이트하는 데 어려움을 겪고 있습니다.Mongodb에서 집계 업데이트
문헌 :
"_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허용 "으로 대체되었다 전체 초대 배열로 밖으로 일 didnt한다하여 시도 어떻게하면 '수락 가능'필드의 토글을 전환 할 수 있습니까? 특히 'ID'과 일치합니다.
Invitation.$.Accepted
위치 지정 연산자를 반복 할 수 없도록 배열을 포함하는 필드에 적용 doesnot 허용 필드
EDIT :
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 on'.find()'가 이미 정의 된 Invitation 배열을 반환합니다.'console.log (docs)'에서 테스트했지만이 이상한 오류가 계속 발생합니다. –