programing

MongoDB에서 $in 쿼리에 전달되는 파라미터의 최대 수는 몇 개입니까?

lastcode 2023. 3. 13. 20:32
반응형

MongoDB에서 $in 쿼리에 전달되는 파라미터의 최대 수는 몇 개입니까?

MongoDB에서 $in 쿼리에 전달되는 파라미터의 최대 수는 몇 개입니까?

쿼리 자체는 문서입니다. MongoDB는 문서 크기(2.4.0 이상)를 16MB로 제한합니다.

사실, 당신이 찾는 것은 다음과 같습니다.

db.collectionName.find(queryDoc)

여기서 'queryDoc'은 다음과 같습니다.

{ 'fieldOne' : { $in : [ 1, 2, 3, 4] } }

$in 쿼리에 전달할 수 있는 최대 값 수를 찾으려면 bsonsize 명령을 사용합니다.

mongos> Object.bsonsize([1])
16
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4] } })
74
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5] } })
85
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6] } })
96

따라서 추가되는 모든 정수의 크기는 11바이트임을 알 수 있습니다.11비트가 아니라 11바이트.이는 BSON이 내부적으로 64비트 이상의 숫자와 래퍼를 저장하기 때문입니다.이것은, 다음과 같이 간단하게 확인할 수 있습니다.

mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6, 69000] } })
107
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6, 6900000] } })
107
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6, 69000000000] } })
107
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6, 69000000000000] } })
107
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6, 6900000000000000] } })
107
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6, 690000000000000000] } })
107
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6, 69000000000000000000] } })
107
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6, 6900000000000000000000] } })
107
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6, 69000000000000000000000000] } })
107

그래서, 개별 숫자의 크기에 상관없이, 같은 크기의 번즈사이즈입니다.

질문 자체에 대해서:그 질의 서류는 얼마나 큰가요?

pymongo에서 mongos javascript 프롬프트를 통해 $in 절을 사용하여 하나의 필드 쿼리를 위해 이들을 합산하면 $in 쿼리의 최대 크기에 대해 동일한 추가 사실을 얻을 수 있습니다.

mongos> Object.bsonsize({ 'a' : { '$in' : [1] }})
34
mongos> Object.bsonsize({ '' : { '$in' : [1] }})
33
mongos> Object.bsonsize({ '' : { '$in' : [] }})
22
  • 쿼리 문서 자체는 22바이트입니다.
  • 필드 이름의 각 바이트는 1바이트를 추가합니다.
  • $in 절에 추가된 각 숫자는 11바이트를 추가합니다.

따라서, 1바이트의 필드명(최소, 정말로)이 있다고 가정하면, 최대치는 다음과 같습니다.

mongos> 16*1024*1024
16777216
mongos> (16*1024*1024) - 22 - 1 
16777193
mongos> ((16*1024*1024) - 22 -1) / 11
1525199.3636363635

정답: 1,525,198 (150만)꽤 크네요.)

제한은 없는 것 같아요.

나는 작은 테스트를 했다.

1) 컬렉션 A에는 100만 개의 단순 JSON 오브젝트 {id:,name:}이(가)

2) Collection B에서는 Collection A의 레퍼런스 ID를 로드하여 다음과 같은 예외를 인정받았습니다.최대 450k의 참조 카운트를 삽입할 수 있습니다.

Exception in thread "main" com.mongodb.MongoInternalException: DBObject of size 18388885 is over Max BSON size 16777216

3) $in[id1...id450000]으로 이 ID 중 45k를 전송하여 컬렉션 A의 100만 객체에서 45k ID의 전체 목록을 가져올 수 있습니다.

와! 이 정도면 내 지원서 :D에 충분하고도 남는다.MongoDB 정말 멋있어요.

제한은 단지 BSONDOURE의 크기에 따라 결정된다고 생각합니다.쿼리를 정의할 때 최대 문서 크기를 초과할 때까지 $in 절에 값을 계속 추가할 수 있습니다.따라서 절에 포함할 수 있는 값의 수는 각 값의 크기에 따라 달라집니다(각 값의 크기가 작을수록 $in 절에 포함할 수 있습니다).

퍼포먼스 면에서는 $in 조항의 값 수에 대해 "스위트 스폿"이 있습니다.다음 관련 질문에서 답변을 참조하십시오.MongoDB를 요청당 여러 번 조회해도 될까요?

즉, $in 절의 값 수와 전송된 쿼리 수의 균형을 유지합니다.좀 더 자세히 알아보기 위해 블로그 투고를 검토 중입니다.

IN 절에 몇 개의 UUID를 전달할 수 있는지 확인하기 위해 답변을 찾고 있었습니다.그래서 혹시 도움이 될지 모르니까 결과를 올리세요.

다음과 같이 500개의 UUID를 전달하려고 했습니다.

 Object.bsonsize({ 'fieldOne' : { $in : [ 
    "3bd209e1-41c9-4ad2-a62c-bbe3d2ae490a",
    "3bd209e1-41c9-4ad2-a62c-bbe3d2ae490a",
    "3bd209e1-41c9-4ad2-a62c-bbe3d2ae490a".
     ..
     ..] } })

결과: 23518

언급URL : https://stackoverflow.com/questions/5331549/what-is-the-maximum-number-of-parameters-passed-to-in-query-in-mongodb

반응형