[MONGODB] 어레이 크기가 1보다 큰 문서를 질의
MONGODB어레이 크기가 1보다 큰 문서를 질의
나는 다음과 같은 형식의 문서와 MongoDB를 수집있다 :
{
"_id" : ObjectId("4e8ae86d08101908e1000001"),
"name" : ["Name"],
"zipcode" : ["2223"]
}
{
"_id" : ObjectId("4e8ae86d08101908e1000002"),
"name" : ["Another ", "Name"],
"zipcode" : ["2224"]
}
나는 현재 특정 배열의 크기에 맞게 문서를 얻을 수 있습니다 :
db.accommodations.find({ name : { $size : 2 }})
이 올바르게 이름 배열의 두 요소와 문서를 반환합니다. 그러나, 나는 이름 필드 2보다 큰 배열의 크기가 모든 문서를 반환하는 $ GT는 명령을 수행 할 수 없습니다
db.accommodations.find({ name : { $size: { $gt : 1 } }})
어떻게 (바람직 현재 데이터 구조를 수정하지 않고)보다 크기 이상의 이름 배열로 모든 문서를 선택할 수 있습니다?
해결법
-
==============================
1.최신 정보:
최신 정보:
할 MongoDB를 버전 2.2보다 효율적인 방법이 다른 대답 @JohnnyHK 설명.
1.Using $ 경우
db.accommodations.find( { $where: "this.name.length > 1" } );
그러나...
2.Create 추가 필드 NamesArrayLength, 이름 배열 길이를 업데이트 한 다음 쿼리에서 사용
db.accommodations.find({"NamesArrayLength": {$gt: 1} });
그것은 더 나은 솔루션이 될 것이며, 훨씬 빠르게 작동합니다 (당신이 그것에 인덱스를 만들 수 있습니다.)
-
==============================
2.당신은 쿼리 객체 키에 숫자 배열 인덱스를 사용할 수있는 지금 MongoDB를 2.2에서이 작업을 수행 할 수있는보다 효율적인 방법이있다.
당신은 쿼리 객체 키에 숫자 배열 인덱스를 사용할 수있는 지금 MongoDB를 2.2에서이 작업을 수행 할 수있는보다 효율적인 방법이있다.
// Find all docs that have at least two name array elements. db.accommodations.find({'name.1': {$exists: true}})
당신은 부분 필터 식을 사용하는 인덱스이 쿼리를 지원할 수 있습니다 (3.2 이상 필요) :
// index for at least two name array elements db.accommodations.createIndex( {'name.1': 1}, {partialFilterExpression: {'name.1': {$exists: true}}} );
-
==============================
3.이 where 절 해석 $를 사용하지 않기 때문에,이 질문에 답 가장 빠른 쿼리이라고 생각 :
이 where 절 해석 $를 사용하지 않기 때문에,이 질문에 답 가장 빠른 쿼리이라고 생각 :
{$nor: [ {name: {$exists: false}}, {name: {$size: 0}}, {name: {$size: 1}} ]}
그것은 "이름없는 사람들 (비 존재하지 않는 또는 빈 배열 중 하나) 또는 하나의 이름을 제외한 모든 문서"을 의미합니다.
테스트:
> db.test.save({}) > db.test.save({name: []}) > db.test.save({name: ['George']}) > db.test.save({name: ['George', 'Raymond']}) > db.test.save({name: ['George', 'Raymond', 'Richard']}) > db.test.save({name: ['George', 'Raymond', 'Richard', 'Martin']}) > db.test.find({$nor: [{name: {$exists: false}}, {name: {$size: 0}}, {name: {$size: 1}}]}) { "_id" : ObjectId("511907e3fb13145a3d2e225b"), "name" : [ "George", "Raymond" ] } { "_id" : ObjectId("511907e3fb13145a3d2e225c"), "name" : [ "George", "Raymond", "Richard" ] } { "_id" : ObjectId("511907e3fb13145a3d2e225d"), "name" : [ "George", "Raymond", "Richard", "Martin" ] } >
-
==============================
4.당신도 총을 사용할 수 있습니다 :
당신도 총을 사용할 수 있습니다 :
db.accommodations.aggregate( [ {$project: {_id:1, name:1, zipcode:1, size_of_name: {$size: "$name"} } }, {$match: {"size_of_name": {$gt: 1}}} ])
// 당신은 교통 문서에 "size_of_name"를 추가하고 이름의 크기를 필터링하는 데 사용
-
==============================
5.의 없음 위의 나를 위해 일하지 않는다. 나는 그것을 공유하고있어, 그래서이 사람은했다 :
의 없음 위의 나를 위해 일하지 않는다. 나는 그것을 공유하고있어, 그래서이 사람은했다 :
db.collection.find( {arrayName : {$exists:true}, $where:'this.arrayName.length>1'} )
-
==============================
6.이런 식으로 뭔가를 시도 :
이런 식으로 뭔가를 시도 :
db.getCollection('collectionName').find({'ArrayName.1': {$exists: true}})
당신이 (50)는 다음 ArrayName.50을보다 기록 이상을 인출 할 경우 1, 번호 감사.
-
==============================
7.
db.accommodations.find({"name":{"$exists":true, "$ne":[], "$not":{"$size":1}}})
-
==============================
8.당신은 일반 쿼리에서 집계 함수를 사용하여 $ EXPR (3.6 몽고 버전 연산자)를 사용할 수 있습니다.
당신은 일반 쿼리에서 집계 함수를 사용하여 $ EXPR (3.6 몽고 버전 연산자)를 사용할 수 있습니다.
집계 비교 연산자 대 쿼리 연산자를 비교.
db.accommodations.find({$expr:{$gt:[{$size:"$name"}, 1]}})
-
==============================
9.나는 특정 길이보다 배열 필드 더있는 항목을 찾아,이 솔루션을 발견
나는 특정 길이보다 배열 필드 더있는 항목을 찾아,이 솔루션을 발견
db.allusers.aggregate([ {$match:{username:{$exists:true}}}, {$project: { count: { $size:"$locations.lat" }}}, {$match:{count:{$gt:20}}} ])
첫 번째 $ 일치 집계 문서 모두를위한 진정한 인수 먹으 렴을 사용합니다. 만약 비어 있다면, 내가 얻을 것
"errmsg" : "exception: The argument to $size must be an Array, but was of type: EOO"
-
==============================
10.MongoDB를 3.6 $ expr에 포함 https://docs.mongodb.com/manual/reference/operator/query/expr/
MongoDB를 3.6 $ expr에 포함 https://docs.mongodb.com/manual/reference/operator/query/expr/
당신은 $ 일치 안에 식을 평가하거나 찾기 위해 $ EXPR를 사용할 수 있습니다.
{ $match: { $expr: {$gt: [{$size: "$yourArrayField"}, 0]} } }
또는 발견
collection.find({$expr: {$gte: [{$size: "$yourArrayField"}, 0]}});
-
==============================
11.위의 답변 있지만 원래하려고 노력 무엇 모든 작업은, 그러나 당신은 구문 뒤로 (스위치 "$ 크기"와 "$ 하였다")를 가지고, 올바른 방법이었다 ..
위의 답변 있지만 원래하려고 노력 무엇 모든 작업은, 그러나 당신은 구문 뒤로 (스위치 "$ 크기"와 "$ 하였다")를 가지고, 올바른 방법이었다 ..
옳은:
db.collection.find({items: {$gt: {$size: 1}}})
잘못된 :
db.collection.find({items: {$size: {$gt: 1}}})
from https://stackoverflow.com/questions/7811163/query-for-documents-where-array-size-is-greater-than-1 by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] MongoDB를 - 업데이트 문서의 배열에 객체 (중첩 된 업데이트) (0) | 2019.11.29 |
---|---|
[MONGODB] 어떻게 중첩 된 오브젝트를 조회하는? (0) | 2019.11.29 |
[MONGODB] 이 개 필드를 비교에 MongoDB의 쿼리 조건 (0) | 2019.11.29 |
[MONGODB] MongoDB의에서 임의의 기록 (0) | 2019.11.29 |
[MONGODB] 컬렉션에서 모든 키의 이름을 가져옵니다 (0) | 2019.11.29 |