복붙노트

[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. ==============================

    1.당신이 원하는 쿼리는 이것이다 :

    당신이 원하는 쿼리는 이것이다 :

    db.collection.find({"users":{"$not":{"$elemMatch":{"user":{$nin:[1,5,7]}}}}})
    

    이것은 나에게 목록 1,5,7 외부에있는 요소를 가지고 있지 않은 모든 문서를 찾을 수 말한다.

  2. ==============================

    2.나는 약 잘 모르겠지만,이 접근하는 몇 가지 방법이 있습니다, 그리고 MongoDB의 버전에 따라 사용 가능한 있습니다.

    나는 약 잘 모르겠지만,이 접근하는 몇 가지 방법이 있습니다, 그리고 MongoDB의 버전에 따라 사용 가능한 있습니다.

    너무 확실 로직은 샘플 배열에 포함해야 해당 문서의 배열 내의 요소와 일치하는 구현되므로으로 첫 번째 문서의 예와 일치합니다 같이이 당신의 의도 여부,하지만 쿼리의 경우.

    당신이 실제로 그 모든 요소를 ​​포함하는 문서를 원한다면 그래서, 다음 $ 모든 운전자는 확실한 선택이 될 것입니다 :

    db.collection.find({ "users.user": { "$all": [ 1, 5, 7 ] } })
    

    하지만 당신의 논리가 실제로 적어도 제안에 따라 당신이 어디에 $에 덜 문서 제목 때문에 운영자에 $로 결합하여 "필터"그 결과가 수, 의도 것으로 추정 작업 **

  3. ==============================

    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가 배열이 아닌 사용자가 모든 문서와 일치합니다. $ 그래서 배열의 모든 사용자가 모든 문서를 일치하지 않습니다.

  4. from https://stackoverflow.com/questions/23595023/check-if-every-element-in-array-matches-condition by cc-by-sa and MIT license