2013-07-24 5 views
0

나는 노드와 mongodb를 사용하고 있고, 추측 할 수없는 내 컬렉션의 배열에서 하위 문서를 제거하는 데 문제가 있습니다. 내 '카드 소지자'컬렉션에서MongodDB에서 배열에서 하위 문서 제거

샘플 문서처럼 보이는 (지면 다른 분야의 제거) :

{ 
    "_id" : ObjectId("51ee899ec15d5aaff39d3352"), 
    "cards" : [ 
      { 
       "rfid_id" : ObjectId("51ee899ec15d5aaff39d335a") 
      } 
    ] 
} 

내가이 rfid_id와 하위 문서를 가지고있는 모든 카드 소지자 문서를 찾을 수있다 할 시도하고 있습니다 카드 배열의 값.

db.cardholders.update({}, 
    {$pull:{ "cards": {"rfid_id": ObjectId("51ee899ec15d5aaff39d335a")}}}, 
    false, false) 

을 내가 구문 오류를하지 않는 동안, 내 컬렉션에 어떤 문서를 초래하지 않습니다 -이 문제에 어떤 도움을 크게 감상 할 수있다 :

은 내가 몽고 명령을 시도했습니다! 전체 문서 세부

편집 :

{ 
    "_id" : ObjectId("51ee899ec15d5aaff39d3353"), 
    "first" : "first", 
    "last" : "last", 
    "email" : "email", 
    "phone" : "555 555 5555", 
    "userRole" : "su", 
    "cards" : [ 
      { 
        "rfid_id" : ObjectId("51ee899ec15d5aaff39d3359") 
      } 
    ], 
    "zones" : [ 
      { 
        "zone_id" : ObjectId("51ee899ec15d5aaff39d3357") 
      } 
    ] 
} 
+0

특정 요소와 일치시키기 위해 rfid_id에서 $ elemMatch를 시도 했습니까? – drz

+0

지금 사용했다 : db.cardholders.update ({}, {$ 풀 : { "카드": {$ elemMatch : {rfid_id : ObjectId가 ("51ee899ec15d5aaff39d335a")}}}}, 거짓 거짓) 같은 결과 (없음) –

+0

원래 질문에있는 코드가 시도했을 때 성공적으로 카드 배열 요소를 제거했습니다. – JohnnyHK

답변

3

귀하의 예는 잘 작동합니다 :

db.so.drop(); 
db.so.insert(
{ 
    "_id" : ObjectId("51ee899ec15d5aaff39d3353"), 
    "first" : "first", 
    "last" : "last", 
    "email" : "email", 
    "phone" : "555 555 5555", 
    "userRole" : "su", 
    "cards" : [ 
      { 
        "rfid_id" : ObjectId("51ee899ec15d5aaff39d3359") 
      } 
    ], 
    "zones" : [ 
      { 
        "zone_id" : ObjectId("51ee899ec15d5aaff39d3357") 
      } 
    ] 
}); 

db.so.update({}, {$pull:{ "cards": {"rfid_id": ObjectId("51ee899ec15d5aaff39d3359")}}}, false, false) 
db.so.find().pretty(); 

출력 :

{ 
    "_id" : ObjectId("51ee899ec15d5aaff39d3353"), 
    "cards" : [ ], 
    "email" : "email", 
    "first" : "first", 
    "last" : "last", 
    "phone" : "555 555 5555", 
    "userRole" : "su", 
    "zones" : [ 
     { 
      "zone_id" : ObjectId("51ee899ec15d5aaff39d3357") 
     } 
    ] 
} 

나는 풀의 OBJECTID을 변경해야 않았지만 약간의 차이는 처음에는 단순한 버전과 전체 버전 사이의 다른 문자열을 사용했기 때문입니다. 문서.

+2

작동해야하는대로이 대답을 수락했습니다. 그것을 작동 시키려면 : 업저 트를 추가하는 것이었다 : db.so.update ({}, {$ pull : { "cards": { "rfid_id": ObjectId ("51ee899ec15d5aaff39d3359")}}, {upsert : false, 멀티 : true}) 그리고 마침내 - 다들 고마워! –