2016-10-08 3 views
0

내부 배열의 특정 항목을 포함하지 않는 문서 세트를 어떻게 반환 할 수 있습니까?특정 내부 배열 항목을 포함하지 않는 MongoDB 문서를 반환하십시오.

내 데이터 구조는 다음과 같습니다

게시물 :

{ 
    "_id" : ObjectId("57f91ec96241783dac1e16fe"), 
    "votedBy" : [ 
     { 
      "userId" : "101", 
      "vote": 1 
     }, 
     { 
      "userId" : "202", 
      "vote": 2 
     } 
    ], 
    "__v" : NumberInt(0) 
} 

나는 votedBy 배열 항목 중 하나에 지정된 사용자 ID가 포함되지 않은있는 게시물의 집합을 반환하고자합니다. 공식 문서이 가능하다는 것을 의미한다 :

MongoDB documentation: Field with no specific array index

가 (특정 배열 항목을 가지고있는 문서를 찾는 더 간단한 경우에) 빈 집합을 반환하지만. 정확한 결과 집합에 대한 색인을 알아야 할 것 같습니다 : votedBy.0.userId.

This 질문 (내 방식에 적용)이 솔루션, 내가 찾은 가장 가까운 :

db.collection.find({"votedBy": { $not: {$elemMatch: {userId: 101 } } } }) 

배열에서 유일하게 내부 문서가 나는 반환하지하고자하는 하나와 일치하는 경우는 잘 작동하지만, 위에서 지정한 예제의 경우 userId = 202 내부 문서가 있으므로 문서가 반환됩니다.

명확히하기 : 모든 votedBy 배열 항목 중 주어진 사용자 ID가없는 모든 문서를 반환하고 싶습니다.

또한 userId 만 문자열 배열로 포함하는 더 간단한 배열을 시도했지만 여전히 각자가 ID를 받고 검색 프로세스가 동일합니다.

다른 해결책은 사용자 모음에 다른 컬렉션을 사용하고 SQL 유사 조인을 수행하기 위해 조회를 적용하는 것이지만 더 쉬운 방법이있는 것처럼 보입니다.

나는 몽구스 (node.js)를 사용하고 있습니다. 임베디드 userId

답변

1

사용자 $ne :

db.collection.find({'votedBy.userId': {$ne: '101'}}) 

그것은 userId = "101"

+0

안녕 @ 톰의 적어도 하나 개의 원소, 답장을 보내 주셔서 감사로 모든 ​​문서를 필터링합니다. 나는 이것이 작동하지 않는 것이 아닌가 걱정된다 (모든 문서를 돌려 준다). 좀 더 간단한 예제를 보자. { 'votedBy.userId': '101'} Shoud는 요소 101이있는 문서 만 반환하지만 전혀 결과를 반환하지 않습니다. 이유는, 내 의견으로는, 'votedBy.0.userId'(모든 인덱스를 반복해야하는 곳)에서만 작동하지만,이 결합 점 방식에서는 아무 것도 찾지 못한다는 것입니다. –

+1

@ Bobcat100 작동 중입니다. 버전 3.2에서 테스트 했으므로 (이전 버전에 대해서는 모르겠 음) 스키마가 질문과 정확하게 일치하는지, 올바르게 복사했는지 확인하십시오. 당신이주는 예제와'$ ne'를 가진 쿼리는 동일하지 않습니다. '{ 'votedBy.userId': '101'}'은 적어도 하나의 요소가''101 ''인 모든 문서를 반환 할 것이고, 내 대답은''101 ''을 가진 요소가없는 문서를 반환 할 것입니다. '. – TomG

+0

더 간단한 쿼리에서 votedBy.userId가 작동하지 않는다는 것을 보여주기 위해 예제는 실제로 다릅니다. 나는이 버전을 지원해야하는 최신 Azure documentDB를 사용하고 있기 때문에 나는 다른 버전을 갖고 있다고 생각하지 않는다. 내 예 : { 'votedBy.userId ':'101 '}는 101 또는 [] 응답을 포함하는 문서를 반환합니까? 고마워, 바락. –

관련 문제