복붙노트

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

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

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

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

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

    5.의 없음 위의 나를 위해 일하지 않는다. 나는 그것을 공유하고있어, 그래서이 사람은했다 :

    의 없음 위의 나를 위해 일하지 않는다. 나는 그것을 공유하고있어, 그래서이 사람은했다 :

    db.collection.find( {arrayName : {$exists:true}, $where:'this.arrayName.length>1'} )
    
  6. ==============================

    6.이런 식으로 뭔가를 시도 :

    이런 식으로 뭔가를 시도 :

    db.getCollection('collectionName').find({'ArrayName.1': {$exists: true}})
    

    당신이 (50)는 다음 ArrayName.50을보다 기록 이상을 인출 할 경우 1, 번호 감사.

  7. ==============================

    7.

    db.accommodations.find({"name":{"$exists":true, "$ne":[], "$not":{"$size":1}}})
    
  8. ==============================

    8.당신은 일반 쿼리에서 집계 함수를 사용하여 $ EXPR (3.6 몽고 버전 연산자)를 사용할 수 있습니다.

    당신은 일반 쿼리에서 집계 함수를 사용하여 $ EXPR (3.6 몽고 버전 연산자)를 사용할 수 있습니다.

    집계 비교 연산자 대 쿼리 연산자를 비교.

    db.accommodations.find({$expr:{$gt:[{$size:"$name"}, 1]}})
    
  9. ==============================

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

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

    11.위의 답변 있지만 원래하려고 노력 무엇 모든 작업은, 그러나 당신은 구문 뒤로 (스위치 "$ 크기"와 "$ 하였다")를 가지고, 올바른 방법이었다 ..

    위의 답변 있지만 원래하려고 노력 무엇 모든 작업은, 그러나 당신은 구문 뒤로 (스위치 "$ 크기"와 "$ 하였다")를 가지고, 올바른 방법이었다 ..

    옳은:

    db.collection.find({items: {$gt: {$size: 1}}})
    

    잘못된 :

    db.collection.find({items: {$size: {$gt: 1}}})
    
  12. from https://stackoverflow.com/questions/7811163/query-for-documents-where-array-size-is-greater-than-1 by cc-by-sa and MIT license