programing

Mongo 쿼리 질문 $gt, $lt

starjava 2023. 7. 11. 21:24
반응형

Mongo 쿼리 질문 $gt, $lt

아래에 질문이 있습니다.저는 4에서 6 사이의 아이템을 받고 싶어서 a:1만 일치해야 합니다. 왜냐하면 b의 값이 5이기 때문입니다.

> db.test.find({ b : { $gt :  4  }, b: {$lt : 6}});
{ "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 3, 4, 5 ] }
{ "_id" : ObjectId("4d54d0074364000000004332"), "a" : 2, "b" : [ 2, 4, 6, 8 ] }
>

누가 왜 a:2가 이 쿼리와 일치하는지 알 수 있습니까?저는 왜 그것이 반송되는지 잘 모르겠습니다.

튜토리얼에 명시된 것도 시도해봤지만 id가 작동하지 않았습니다.

> db.test.find({ b : { $gt :  4, $lt : 6}});
{ "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 3, 4, 5 ] }
{ "_id" : ObjectId("4d54d0074364000000004332"), "a" : 2, "b" : [ 2, 4, 6, 8 ] }
>

그리고 이것은 GT/GTE에 관한 혼동을 피하기 위한 것입니다.

> db.test.find({b: {$gt: 4.5, $lt: 5.5}});
{ "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 3, 4, 5 ] }
{ "_id" : ObjectId("4d54d0074364000000004332"), "a" : 2, "b" : [ 2, 4, 6, 8 ] }
>

a:1만 반환해야 합니다.

제안한 대로 $elemMatch를 시도했지만 작동하지 않았습니다(objectIds는 다른 기계에 있기 때문에 다릅니다).

> db.test.find();
{ "_id" : ObjectId("4d5a24a5e82e00000000433f"), "a" : 1, "b" : [ 2, 3, 4, 5 ] }
{ "_id" : ObjectId("4d5a24bbe82e000000004340"), "a" : 2, "b" : [ 2, 4, 6, 8 ] }
> db.test.find({b: {$elemMatch: {$gt : 4, $lt: 6 }}});
>

반환된 문서가 없습니다.

이것은 정말 혼란스러운 주제입니다.저는 10gen에서 일하고 있고 머리를 싸매고 시간을 보내야 했습니다 ;)

이제 쿼리 엔진이 이 쿼리를 처리하는 방법에 대해 살펴보겠습니다.

다음은 다시 질문입니다.

> db.test.find({ b : { $gt :  4, $lt : 6}});

일치해서는 안 될 것 같은 기록에 관한 한...

{ "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 4, 6, 8 ] }

배열의 각 요소에 대해 일치가 수행되지 않고 배열 전체에 대해 일치가 수행됩니다.

비교는 세 단계로 수행됩니다.

1단계: b의 값이 4보다 큰 모든 문서 찾기

b: 6과 8이 4보다 크기 때문에 [2,4,6,8] 일치

2단계: b의 값이 6보다 작은 모든 문서 찾기

b: 2와 4가 6보다 작기 때문에 [2,4,6,8] 일치

3단계: 1단계와 2단계 모두에서 일치하는 문서 집합을 찾습니다.

b: [2,4,6,8]인 문서가 1단계와 2단계 모두 일치하므로 일치 항목으로 반환됩니다.이 단계에서는 결과도 중복되지 않으므로 동일한 문서가 두 번 반환되지 않습니다.

쿼리를 배열 전체가 아닌 배열의 개별 요소에 적용하려면 $elemMatch 연산자를 사용할 수 있습니다.예를들면

> db.temp.find({b: {$elemMatch: {$gt: 4, $lt: 5}}})
> db.temp.find({b: {$elemMatch: {$gte: 4, $lt: 5}}})
  { "_id" : ObjectId("4d558b6f4f0b1e2141b66660"), "b" : [ 2, 3, 4, 5, 6 ] }

$gt

Syntax: {field: {$gt: value} }

예:

db.inventory.find( { qty: { $gt: 20 } } )

$lt

Syntax: {field: {$lt: value} }

예:

db.inventory.find( { qty: { $lt: 20 } } )

예2:

db.inventory.find({ qty : { $gt :  20, $lt : 60}});
.find( {$and:[ {b:{$gt:4}}, {b:{$lt:6}} ]} )

아래는 이해를 위한 상세한 문서입니다.

db.test.insertMany([
    {"_id":1, "x":11, "a":1, "b":[1]},
    {"_id":2, "x":15, "a":4, "b":[1,2,3]},
    {"_id":3, "x":19, "a":5, "b":[1,2,3,4,5]},
    {"_id":4, "x":13, "a":6, "b":[6,8,10]},
    {"_id":5, "x":16, "a":13, "b":[11]},
    {"_id":6, "x":18, "a":11, "b":[5]},
    {"_id":7, "x":15, "a":15, "b":[3,5,7]},
    {"_id":8, "x":12, "a":18, "b":[3,7,9]},
    {"_id":9, "x":14, "a":21, "b":[4,6]}
]);

비교에 대한 아이디어를 명확하게 하기 위해 아래 쿼리가 포함되어 있습니다.
쿼리-1:db.test.find({b: {$lt: 6}}); //(any element of b) < 6

{ "_id" : 1, "x" : 11, "a" : 1, "b" : [ 1 ] }
{ "_id" : 2, "x" : 15, "a" : 4, "b" : [ 1, 2, 3 ] }
{ "_id" : 3, "x" : 19, "a" : 5, "b" : [ 1, 2, 3, 4, 5 ] }
{ "_id" : 6, "x" : 18, "a" : 11, "b" : [ 5 ] }
{ "_id" : 7, "x" : 15, "a" : 15, "b" : [ 3, 5, 7 ] }
{ "_id" : 8, "x" : 12, "a" : 18, "b" : [ 3, 7, 9 ] }
{ "_id" : 9, "x" : 14, "a" : 21, "b" : [ 4, 6 ] }

`

쿼리-2:db.test.find({b: {$gt: 4}, b:{$lt : 6}});// it is translated to db.test.find({b:{$lt : 6}}); hence the outcome of Query-1 and Query-2 is the same.

{ "_id" : 1, "x" : 11, "a" : 1, "b" : [ 1 ] }
{ "_id" : 2, "x" : 15, "a" : 4, "b" : [ 1, 2, 3 ] }
{ "_id" : 3, "x" : 19, "a" : 5, "b" : [ 1, 2, 3, 4, 5 ] }
{ "_id" : 6, "x" : 18, "a" : 11, "b" : [ 5 ] }
{ "_id" : 7, "x" : 15, "a" : 15, "b" : [ 3, 5, 7 ] }
{ "_id" : 8, "x" : 12, "a" : 18, "b" : [ 3, 7, 9 ] }
{ "_id" : 9, "x" : 14, "a" : 21, "b" : [ 4, 6 ] }

쿼리-3:db.test.find({b: {$gt: 4, $lt: 6}});

{ "_id" : 3, "a" : 5, "b" : [ 1, 2, 3, 4, 5 ] }//(element 5) > 4 and (element 5) < 6` => The matching element is same here element 5
{ "_id" : 6, "a" : 11, "b" : [ 5 ] }//(element 5) > 4 and (element 5) < 6 => The matching element is same here element 5
{ "_id" : 7, "a" : 15, "b" : [ 3, 5, 7 ] }//(element 5) > 4 and (element 5) < 6 => The matching element is same here element 5
{ "_id" : 8, "a" : 18, "b" : [ 3, 7, 9 ] }//(element 5) > 7 and (element 3) < 6 => The matching elements are different i.e. here element 5 and element 3
{ "_id" : 9, "a" : 21, "b" : [ 4, 6 ] }//(element 6) > 4 and (element 4) < 6 => The matching elements are different i.e. here element 4 and element 6

쿼리-4:db.test.find({b: {$elemMatch: {$gt : 4, $lt: 6 }}});

{ "_id" : 3, "a" : 5, "b" : [ 1, 2, 3, 4, 5 ] }//(element 5) > 4 and (element 5) <6
{ "_id" : 6, "a" : 11, "b" : [ 5 ] }//(element 5) > 4 and (element 5) <6
{ "_id" : 7, "a" : 15, "b" : [ 3, 5, 7 ] }//(element 5) > 4 and (element 5) <6

Query-3과 Query-4는 알아두면 흥미롭습니다.
쿼리-3: 배열 b 요소 x>4와 요소 y<6이 있는 문서를 나열합니다.요소 x와 y는 동일하거나 다를 수 있습니다.
쿼리-4: 배열 b 요소 x>4와 요소 y<6이 있는 문서를 나열합니다.요소 x와 y는 같아야 합니다.

당신이 문서를 확인하지 않았기 때문입니다.

http://www.mongodb.org/display/DOCS/Advanced+Queries

페이지에서 "잘못된" 부분을 확인합니다.

쿼리 구문이 올바르지 않습니다(예와 비교).

또한 'a'가 쿼리에 포함되어 있지 않기 때문에 질문의 "왜 a:2" 부분은 의미가 없습니다.a:1을 검색하려면 쿼리에 포함해야 합니다.

$or 연산자를 사용하지 않는 한 모든 쿼리 절은 기본적으로 AND 결합됩니다.

언급URL : https://stackoverflow.com/questions/4966203/mongo-query-question-gt-lt

반응형