[MONGODB] 배열의 모든 요소가 조건에 일치하는 경우 확인
MONGODB배열의 모든 요소가 조건에 일치하는 경우 확인
나는 문서의 컬렉션이 있습니다 :
date: Date
users: [
{ user: 1, group: 1 }
{ user: 5, group: 2 }
]
date: Date
users: [
{ user: 1, group: 1 }
{ user: 3, group: 2 }
]
나는 사용자의 내 배열의 모든 사용자 ID가 다른 배열에있는 모든 문서, [1, 5, 7]을 찾기 위해이 컬렉션에 대해 쿼리하고 싶습니다. 이 예에서 첫 번째 문서는 일치합니다.
내가 찾을 수 있었던 가장 좋은 방법은하는 것입니다 :
$where: function() {
var ids = [1, 5, 7];
return this.users.every(function(u) {
return ids.indexOf(u.user) !== -1;
});
}
불행하게도,이 상처 성능은 어디에 문서 $에 명시되는 것 같다 :
어떻게이 쿼리를 향상시킬 수 있습니까?
해결법
-
==============================
1.당신이 원하는 쿼리는 이것이다 :
당신이 원하는 쿼리는 이것이다 :
db.collection.find({"users":{"$not":{"$elemMatch":{"user":{$nin:[1,5,7]}}}}})
이것은 나에게 목록 1,5,7 외부에있는 요소를 가지고 있지 않은 모든 문서를 찾을 수 말한다.
-
==============================
2.나는 약 잘 모르겠지만,이 접근하는 몇 가지 방법이 있습니다, 그리고 MongoDB의 버전에 따라 사용 가능한 있습니다.
나는 약 잘 모르겠지만,이 접근하는 몇 가지 방법이 있습니다, 그리고 MongoDB의 버전에 따라 사용 가능한 있습니다.
너무 확실 로직은 샘플 배열에 포함해야 해당 문서의 배열 내의 요소와 일치하는 구현되므로으로 첫 번째 문서의 예와 일치합니다 같이이 당신의 의도 여부,하지만 쿼리의 경우.
당신이 실제로 그 모든 요소를 포함하는 문서를 원한다면 그래서, 다음 $ 모든 운전자는 확실한 선택이 될 것입니다 :
db.collection.find({ "users.user": { "$all": [ 1, 5, 7 ] } })
하지만 당신의 논리가 실제로 적어도 제안에 따라 당신이 어디에 $에 덜 문서 제목 때문에 운영자에 $로 결합하여 "필터"그 결과가 수, 의도 것으로 추정 작업 **
-
==============================
3.난 그냥 객체 비교보다는 엄격한 평등 위하기 Asya의 솔루션을 구현하려고 내 하루의 상당 부분을 보냈다. 그래서 나는 여기를 공유 할 거라고 생각.
난 그냥 객체 비교보다는 엄격한 평등 위하기 Asya의 솔루션을 구현하려고 내 하루의 상당 부분을 보냈다. 그래서 나는 여기를 공유 할 거라고 생각.
하자 당신이 전체 사용자에게 사용자 ID에서 질문을 확장 말한다. 그 사용자의 배열의 모든 항목이 다른 사용자의 배열에 존재입니다 당신은 모든 문서를 찾으려면 : [{사용자 : 1 그룹 : 3}, {사용자 : 2 그룹 : 5}, ...]
이하지 않습니다 일 : db.collection.find ({ "사용자": { "$ 없다": { "$ elemMatch": { "$ 닌": [{사용자 : 1 그룹 : 3}, {사용자 : 2 그룹 : 5}, ...]}}}}}) $ 닌은 엄격한 평등 작동하기 때문이다. 우리는 객체의 배열은 "안 배열에"표현의 다른 방법을 찾을 필요가 그래서. 그리고 $를 사용하는 경우 너무 많은 쿼리를 느리게한다.
해결책:
db.collection.find({ "users": { "$not": { "$elemMatch": { // if all of the OR-blocks are true, element is not in array "$and": [{ // each OR-block == true if element != that user "$or": [ "user": { "ne": 1 }, "group": { "ne": 3 } ] }, { "$or": [ "user": { "ne": 2 }, "group": { "ne": 5 } ] }, { // more users... }] } } } })
논리를 완성하려면 : $ elemMatch가 배열이 아닌 사용자가 모든 문서와 일치합니다. $ 그래서 배열의 모든 사용자가 모든 문서를 일치하지 않습니다.
from https://stackoverflow.com/questions/23595023/check-if-every-element-in-array-matches-condition by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 위치`$ '연산자의 다중 사용은 중첩 된 배열을 업데이트 (0) | 2019.12.03 |
---|---|
[MONGODB] MongoDB를 중복 문서도 고유 키를 추가 한 후 (0) | 2019.12.02 |
[MONGODB] 왜 Node.js를 코드에서 MongoDB를 연결 어느 곳을 폐쇄하지 않는 것이 좋습니다? (0) | 2019.12.02 |
[MONGODB] 오버플로 정렬 단계 버퍼링 된 데이터의 사용은 내부 한계를 초과 (0) | 2019.12.02 |
[MONGODB] MongoDB를 - 페이징 (0) | 2019.12.02 |