0

나는 특정 개체를 필터링하고 부울 필드를 트리거하는 데 어려움을 겪고 초대장에 개체 컬렉션이 있습니다.하위 문서 및 트리거 필터

문서 : 여기

"Invitation" : [ 
{ 
    "__v" : 0, 
    "userID" : ObjectId("54afaabd88694dc019d3b628"),//ObjectId of personA 
    "__t" : "USER", 
    "_id" : ObjectId("54b5022b583973580c706784"), 
    "Accepted" : false 
}, 
{ 
    "__v" : 0, 
    "userID" : ObjectId("54af6ce091324fd00f97a15f"),//ObjectId of personB 
    "__t" : "USER", 
    "_id" : ObjectId("54bde39cdd55dd9016271f14"), 
    "Accepted" : false 
} 
] 

제가 초대 어레이 안에 두 개의 개체가, 3 개 이상의 수있다. 난의 초대를 수락하면 지금의이 인물personB 나에게 초대, 그래서 두 개의 서로 다른 초대 객체 (위 문서의 아이디) 두 사람의 OBJECTID로, 다른 분야를 가진 데이터베이스에 삽입을 전송한다고 가정 해 봅시다 personA,해야합니다 방아쇠 허용 필드 personA 개체 만, 여기 내가 지금까지 노력했지만 예상대로 작동하지 않습니다.

컨트롤러 : 마지막으로

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

}); 

나는 인물의 인물 다음 허용 필드의 초대를 수락하는 경우처럼 하나의 요소를 필터링하거나을 반대하는 데 사용할 수있는 쿼리를 찾고 있어요 object를 true로 설정해야합니다. 약간의 로직이 제공된다면 정말 도움이 될 것입니다. 는

답변

1

아니 아주 명확한 질문을. 하지만 당신이 정말로 당신이 처음에 업데이트 할 수있는 유일한 하위 문서를 일치 여기에해야 할 모든 것 :

User.find(
    { 
     "_id": "req.user._id", 
     "Invitation._id": personA.id 
    }, 
    { "Invitation.$": 1 }, 
    function(err,docs) { 
    // and continue 
    } 
); 

이것은 "투사"컨텍스트에서 positional $ 연산자의 형태이다. "유일한"일치 요소 만 반환됩니다.

"단수"결과를 얻으면 다른 모든 코드는 설계대로 작동합니다.

나는 당신을 위해 그것을 썼기 때문에 나는 알아야한다. 당신은 그것에 대해 괜찮은 존경심을 지불하고있는 것이 아닙니다.

Toggle boolean value of subdocuments

또는 personA.userID

Update on Aggregate in Mongodb

또는 무엇이든 그것을 작동합니다.

쿼리 조건과 일치 할 것으로 예상되는 "사용자"의 고유 식별자 만 사용하십시오.

1

당신은이 작업을 수행 할 수 있습니다 감사합니다

db.user.update({"invitation.userID": 1}, {"$set" : {"invitation.$.Accepted" : true}}); 

가 업데이트하려는 사용자 ID로 값 1을 교체.

코드는 MongoShell의 구문에, 단순히 당신이 운영자는 $이었다 사용

사용하는 드라이버 구문을 변환합니다. 문서에 따르면 : 위치 $ 연산자는 배열의 요소 위치를 명시 적으로 지정하지 않고 업데이트 할 배열의 요소를 식별합니다. 읽기 작업에서 배열 요소를 프로젝션하거나 반환하려면 $ projection 연산자를 참조하십시오. 자세한 내용은

은 다음을 참조하십시오 http://docs.mongodb.org/manual/reference/operator/update/positional/

+0

내가 게시 한 코드 안에 코드를 넣어 보았습니다. 결과는'null'이고, 반복은 async.each를 사용해야합니다. 그래서 async.each를 사용하여 응답을 확장하는 방법을 알려주십시오. –