복붙노트

[MONGODB] 배열 필드의 모든 값이 다른 배열에 존재 선택 문서

MONGODB

배열 필드의 모든 값이 다른 배열에 존재 선택 문서

나는 어떻게 제목이 아주 확실하지 않았다!

나는 제품 ID의 배열을 가지고 그래서

var productIds = [139,72,73,1,6]

그리고 MongoDB의에서 고객 문서의 무리

{
    name: 'James',
    products: [ 73, 139 ],
    _id: 5741cff3f08e992598d0a39b
}

{
    name: 'John',
    products: [ 72, 99 ],
    _id: 5741d047f08e992598d0a39e
}

내가 그들의 모든 제품은 제품 ID의 배열에 나타날 때 고객을 찾을 싶습니다 (productIds)

나는 시도했다 :

'products' : {
    '$in': productIds
}

그러나 반환 요한은, 비록 99 제품 ID 목록에 존재하지 않는

나는 또한 시도했다 :

'products' : {
    '$all': productIds
}

아무 것도 반환하지 않습니다 어떤 고객의 어떤 것도 모든 제품이 없기 때문에

나는 하나의 쿼리에서 필요로하거나 좀 후 질의 처리를해야 할 것입니다 무엇을 달성 할 수있는 방법이 있나요?

나는 또한 시도

'products': {
    '$in': productIds,
    '$not': {
        '$nin': productIds
    }
}

그러나 이것은 또한 모든 제품 ID가 일치하는 경우 고객에게 반환하는 것

해결법

  1. ==============================

    1.당신은 .aggregate () 메서드는 $ 편집하다 연산자를 사용하여이 작업을 수행 할 수 있습니다. 당신의 $ 콘드 표현식에서 당신은 "제품"배열의 모든 요소가 "productIds"에 있는지 확인하기 위해 $ setIsSubset를 사용해야합니다. 당신은 조건식에에 $를 사용할 수 없기 때문입니다

    당신은 .aggregate () 메서드는 $ 편집하다 연산자를 사용하여이 작업을 수행 할 수 있습니다. 당신의 $ 콘드 표현식에서 당신은 "제품"배열의 모든 요소가 "productIds"에 있는지 확인하기 위해 $ setIsSubset를 사용해야합니다. 당신은 조건식에에 $를 사용할 수 없기 때문입니다

    var productIds = [139,72,73,1,6];
    db.customers.aggregate([ 
        { "$redact": { 
            "$cond": [ 
                { "$setIsSubset": [ "$products", productIds ] },
                "$$KEEP",
                "$$PRUNE" 
            ] 
        }} 
    ])
    
  2. from https://stackoverflow.com/questions/37376408/select-documents-where-all-values-in-an-array-field-exist-in-another-array by cc-by-sa and MIT license