첫째, 난 당신이 "태그"그렇지 않으면 구조가 유효하지 않을 것이기 때문에 배열 실제로는 것을 의미 확신 :
{ "name": "ABC", "tags": ["@Movie", "#free", "!R"]},
{ "name": "DEF", "tags": ["@Movie", "!PG"]},
{ "name": "GHI", "tags": ["@Sports", "#free"]}
그것은 "태그"데이터 이런 식으로 저장하는 새로운 아이디어가 있지만, 쿼리를 구성하는 프로그램 논리가 $and
조합에서 고려해야 할 최소한 "3 가지"가능한 조건이 있음을 인식해야합니다.
필터 그룹 당 하나의을 선택하는 것이 가장 간단한 형식에서 $all
연산자를 사용하면이 문제를 해결할 수 있습니다. 그냥 간결에 대한 간단한 MongoDB의 쉘 표기법 :
db.collection.find({ "tags": { "$all": [ "@Movie", "!R" ] } })
문제가 당신이 그룹에 복수 선택을 원하는 경우에는 평가가 예를 들어, 다음이 결과 얻기 위해 실패 말할 것입니다 :
db.collection.find({ "tags": { "$all": [ "@Movie", "!R", "!PG" ] } })
을
실제로 두 평가 값이 모두 포함 된 항목이 없으므로 유효하지 않습니다. 따라서 다음과 같이하십시오.
모든 영화는 "R"및 "PG"등급 태그와 정확하게 일치합니다. 일치하는 값으로 필터의 그 "유형"을 각각있는 경우에만 문서를 얻기
db.collection.find({ "$and": [
{ "tags": { "$in": [ "@Movie" ] } },
{ "tags": { "$in": [ "!R", "!PG" ] } },
{ "tags": { "$in": [ "#free" ] }
])
, 그래서 "PG"영화가되지 않습니다 : 다른 그룹이 확장은 기본적으로 $and
표현에 다른 배열 항목을 추진하고있다 무료이고 "스포츠"는 선택 항목에 추가하지 않음으로써 필터링되었습니다.
쿼리를 구성하는 기본 사항은 각 필터 그룹에서 $in
에 대한 선택 옵션 배열로 작업하고 있습니다. 물론 필터 그룹에 선택 항목이있는 경우에만 배열 $and
을 추가 할 수 있습니다.
var query = { "$and":[{}] };
을 그리고 자체에 각 필터 그룹의 조사 각 옵션에 추가 :
그래서 다음과 같이 기본 $and
시작
var inner = { "tags": { "$in": [] } };
inner.tags["$in"].push(item);
그리고 다음에 추가 기본 검색어 :
query["$and"].push(inner);
각 항목에 대해 린스하고 반복하십시오. 그리고 기본 쿼리 그냥 모든 필터링되지 않은 선택하기 때문에이 완벽하게 유효하며,이 또한 추가 로직을 구성하지 않고 유효합니다
db.collection.find({ "$and": [
{ },
{ "tags": { "$in": [ "@Movie" ] } },
{ "tags": { "$in": [ "!R", "!PG" ] } },
{ "tags": { "$in": [ "#free" ] }
])
그래서 정말 MongoDB를 그것을 이해로 쿼리의 제휴로 내려 온다. 이것은 실제로 데이터 구조를 구축하는 데있어 단순한 JavaScript 배열 조작입니다. 모든 MongoDB 쿼리가 실제로 무엇입니까.
위대한 - 그 부분적으로 mongo 기준을 구축 내 문제를 해결합니다. 나는 여전히 모든 필터 범주를 반복하고 최소 하나만 검사 된 항목에 대한 기준을 삽입해야합니다. 또한 실제로 별도의 컬렉션에 태그를 저장하고 있습니다. –