2017-10-23 10 views
0

쿼리 mongoDB를 개체 배열 형태로 쿼리에 전달하는 방법이 필요합니다.쿼리 또는 조건

  1. 문서 : 각 오브젝트는 내가 문서를 쿼리에 맞게, 그것은이 두 가지 조건을 충족해야하는 방식으로 데이터베이스를 조회 할 지금

    { 
    name: "<someName>", 
    someArr: [<someArr>] 
    } 
    

    의 형태로 이름이이고 쿼리의 개체 이름 특성 중 하나 여야합니다.

  2. 문서의 someArr 속성은 조건 1이 true 일 때 쿼리 개체의 someArr의 하위 집합이어야합니다.

쿼리가 단일 개체 인 경우 $ match 및 $ unwind를 사용하여 쿼리 할 수 ​​있습니다.

그래서 mongoDB에 대한 개체 배열을 사용하여 쿼리를 수행 할 수 있는지 또는 각 쿼리 개체에 대해 루프를 수행해야하는지 알고 싶습니다.

감사


예제 :

[ 
    {name: "test", someArr: [1,2]}, 
    {name: "test2", someArr: [3]} 
] 

그리고 데이터베이스는 다음과 같은 포함 :

쿼리는 경우해야 쿼리의

[ 
{name: "test3", someArr: [1,2]}, 
{name: "test", someArr: [1]}, 
{name: "test2", someArr: [4]} 
] 

결과

[{name: "test", someArr: [1]}] 

두 조건이 모두 일치하기 때문에.

답변

1

여기서 "집계"할 필요가 없습니다. 이것은 간단한 쿼리입니다. 수행하는 작업은 초기 "쿼리 배열"을 실제 쿼리 DSL로 변환하는 것뿐입니다. 그리고 단순히 someArr$in을 넣고 $or로 전체 배열을 공급하는 것 : 명확성을 위해

var conditions = [ 
    {name: "test", someArr: [1,2]}, 
    {name: "test2", someArr: [3]} 
]; 

db.collection.find({ 
    "$or": conditions.map(c => Object.assign(c, { someArr: { "$in": c.someArr } })) 
}) 

,의 소스 배열에서 생산이를 변환하는 것이 :

db.collection.find({ 
    "$or": [ 
    {name: "test", someArr: { "$in": [1,2] } }, 
    {name: "test2", someArr: { "$in": [3] } } 
    ] 
}) 

을 그리고 올바른 문서를 반환합니다.

"하위 집합"은 "적어도 하나의 요소를 공유 함"을 의미하며 이는 쿼리 연산자로 $in이 수행하는 것입니다. 따라서 투영을 목적으로하지 않는 한 더 이상 계산할 필요가 없습니다.

+0

하지만 배열을 확인하기 전에 일치하는 이름을 확인해야합니다. 귀하의 쿼리가 이름 확인을합니까? – Bosen

+0

@CodingNoobie 맞습니다 .' Object.assign()'은 기존 데이터를 새로운 데이터와 병합합니다. 그래서 내가 여기에서하는 것은 각 배열 항목에'$ in' 키로'someArr'을 덮어 쓰는 것입니다. '.map()'의 확장 된 전체 쿼리 결과를 보여 주어 명확하게 볼 수 있습니다. –