복붙노트

[MONGODB] MongoDB의 내부 배열 크기 쿼리

MONGODB

MongoDB의 내부 배열 크기 쿼리

사용자 모음의 MongoDB의 문서를 고려 :

{ username : 'Alex', tags: ['C#', 'Java', 'C++'] }

어떤 방법 (클라이언트에 태그를 거치지 않고) 서버 측에서 태그 배열의 길이를 얻을 수 있나요?

고맙습니다!

해결법

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

    1.이제 MongoDB를 (2.6 릴리스) 집계에 $ 크기 작업을 지원합니다.

    이제 MongoDB를 (2.6 릴리스) 집계에 $ 크기 작업을 지원합니다.

    문서에서 :

    { <field>: { $size: <array> } }
    

    당신이를 사용하여 하나에 다음과 같이 수행 할 수 있습니다합니다 :

    db.users.aggregate(
       [
          {
             $group: {
                _id: "$username",
                tags_count:  {$first: {$size: "$tags" }}
             }
          }
       ]
    )
    

    또는

    db.users.aggregate(
       [
          {
             $project: {
                tags_count: {$size: "$tags"}
             }
          }
       ]
    )
    
  2. ==============================

    2.이름 알렉스가 고유 한 경우, 당신은 다음 코드를 사용할 수 있습니다 :

    이름 알렉스가 고유 한 경우, 당신은 다음 코드를 사용할 수 있습니다 :

    db.test.insert({username:"Alex", tags: ['C#', 'Java', 'C++'] });
    db.test.aggregate(
      {$match: {username : "Alex"}}, 
      {$unwind: "$tags"},
      {$project: {count:{$add:1}}},
      {$group: {_id: null, number: {$sum: "$count" }}}
    );
    { "result" : [ { "_id" : null, "number" : 3 } ], "ok" : 1 }
    
  3. ==============================

    3.나는 아마 또는 일정에 작업을 통해 INC $를 사용 (별도의 필드로) 저장 각 태그의 수를 계산하는 것이 더 효율적 것 같아요.

    나는 아마 또는 일정에 작업을 통해 INC $를 사용 (별도의 필드로) 저장 각 태그의 수를 계산하는 것이 더 효율적 것 같아요.

    또한지도 / 감소 (정식 예)이 작업을 수행 할 수 있지만 당신이 원하는 것 무엇을 할 수있을 것 같지 않습니다.

    나는 확실히 당신이 요구하는 무엇을 정확하게하는 것이 가능하지 않다,하지만 당신은 $ 크기가 일정 크기에 맞게 모든 문서를 조회 할 수 있습니다 ...

    > db.collection.find({ tags : { $size: 3 }});
    

    즉 3 개 태그 당신에게 모든 문서를 얻을 것 ...

  4. ==============================

    4.xmm.dev의 대답은 간단하게 할 수 있습니다 대신 중간체 필드 '수'를 가지고, 당신은 $ 그룹에 직접적으로 요약 할 수 있습니다 :

    xmm.dev의 대답은 간단하게 할 수 있습니다 대신 중간체 필드 '수'를 가지고, 당신은 $ 그룹에 직접적으로 요약 할 수 있습니다 :

    db.test.aggregate(
      {$match: {username : "Alex"}}, 
      {$unwind: "$tags"},
      {$group: {_id: null, number: {$sum: 1 }}}
    ) 
    
  5. ==============================

    5.현재, 그것을 할 수있는 유일한 방법은 db.eval을 사용하는 것으로 보이지만, 다른 작업이 잠금 데이터베이스.

    현재, 그것을 할 수있는 유일한 방법은 db.eval을 사용하는 것으로 보이지만, 다른 작업이 잠금 데이터베이스.

    가장 속도 효율적인 방법이 추가 필드를 추가 할 것이라고 저장 배열의 길이와 $ INC와 $ 푸시 조작에 의해 그것을 유지.

  6. ==============================

    6.내가 배열 크기를 조회하고 0보다 큰했지만 1-3에서 아무것도 할 수 있다면 반환 할 필요 나는 주위에 작은 일을했다.

    내가 배열 크기를 조회하고 0보다 큰했지만 1-3에서 아무것도 할 수 있다면 반환 할 필요 나는 주위에 작은 일을했다.

    여기 내 솔루션했다 :

    db.test.find($or : [{$field : { $exists : true, $size : 1}},
                        {$field : { $exists : true, $size : 2}},
                        {$field : { $exists : true, $size : 3}}, ])
    

    속성이 존재하고 크기가 특정 크기 또는 범위 내에서 찾는 경우 1, 2, 3. 사용자는 더 문 및 증분을 추가 할 수 있습니다 때 이것은 기본적으로 문서를 반환합니다. 나는 그것의 완벽하지 알고 있지만 일을했고, 상대적으로 빨랐다. 이 솔루션이 일 때문에 나는 단지 내 특성에 1-3 크기를했다.

  7. from https://stackoverflow.com/questions/6722850/querying-internal-array-size-in-mongodb by cc-by-sa and MIT license