복붙노트

[MONGODB] 제한을 사용할 때 MongoDB를 가진 총 문서의 수를 가져옵니다

MONGODB

제한을 사용할 때 MongoDB를 가진 총 문서의 수를 가져옵니다

나는 MongoDB를 함께 일하고 있어요는 "매김"솔루션을 최적화에 관심이 있어요. 내 문제는 정직이다. 나는 보통 문서의 수는 제한 () 기능을 사용하여 반환 제한합니다. 나는 그들이 추가 요청을 발행해야합니다 알려주는 클라이언트에 그에게 전달할 수 있도록 나 또한 쿼리 문서의 총 수를 캡처하는이 힘 나를 위해 제한 () 기능이없는 중복 쿼리를 실행합니다 (들)은 문서의 나머지 부분을 검색 할 수 있습니다.

1 개 쿼리에이 응축 할 수있는 방법이 있나요? () 문서의 총 수를 가져옵니다 만, 동시에 일부 사용 제한을 검색? 내가 접근하고보다이 문제에 대해 생각하는 다른 방법이 있나요?

해결법

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

    1.아니, 다른 방법이 없습니다. 두 쿼리 - 카운트 하나 - 제한 한. 또는 당신은 다른 데이터베이스를 사용합니다. 당신이 원하는 것처럼 예를 들어 아파치 SOLR 작동합니다. 모든 쿼리가 제한 반환에서는 totalCount된다.

    아니, 다른 방법이 없습니다. 두 쿼리 - 카운트 하나 - 제한 한. 또는 당신은 다른 데이터베이스를 사용합니다. 당신이 원하는 것처럼 예를 들어 아파치 SOLR 작동합니다. 모든 쿼리가 제한 반환에서는 totalCount된다.

  2. ==============================

    2.MongoDB를 3.4 $면 집계 발표했다

    MongoDB를 3.4 $면 집계 발표했다

    $면을 사용하고 $ 그룹 당신은 $ 한계와 문서를 찾을 수 및 총 수를 얻을 수 있습니다.

    당신은 MongoDB를 3.4로 집계 아래로 사용할 수 있습니다

    db.collection.aggregate([
      { "$facet": {
        "totalData": [
          { "$match": { }},
          { "$skip": 10 },
          { "$limit": 10 }
        ],
        "totalCount": [
          { "$group": {
            "_id": null,
            "count": { "$sum": 1 }
          }}
        ]
      }}
    ])
    

    심지어 당신이 MongoDB를 3.6에서 소개 된 $ 카운트 집계를 사용할 수 있습니다.

    당신은 MongoDB를 3.6로 집계 아래로 사용할 수 있습니다

    db.collection.aggregate([
      { "$facet": {
        "totalData": [
          { "$match": { }},
          { "$skip": 10 },
          { "$limit": 10 }
        ],
        "totalCount": [
          { "$count": "count" }
        ]
      }}
    ])
    
  3. ==============================

    3.시간이 변경되었습니다, 나는 당신이 영업 이익은 $ 종류, $ 그룹과 $ 프로젝트 집계를 사용하여 요구하고 무엇을 달성 할 수 있다고 생각합니다. 내 시스템의 경우, 나는 또한 내 사용자 컬렉션에서 일부 사용자 정보를 잡아 필요가 있었다. 희망이뿐만 아니라 그 주변의 모든 질문에 응답 할 수 있습니다. 다음은 집계 파이프입니다. 마지막 세 개체 (종류, 그룹 프로젝트) 핸들 다음 페이지 매김 기능을 제공, 총 수를 얻는 것입니다.

    시간이 변경되었습니다, 나는 당신이 영업 이익은 $ 종류, $ 그룹과 $ 프로젝트 집계를 사용하여 요구하고 무엇을 달성 할 수 있다고 생각합니다. 내 시스템의 경우, 나는 또한 내 사용자 컬렉션에서 일부 사용자 정보를 잡아 필요가 있었다. 희망이뿐만 아니라 그 주변의 모든 질문에 응답 할 수 있습니다. 다음은 집계 파이프입니다. 마지막 세 개체 (종류, 그룹 프로젝트) 핸들 다음 페이지 매김 기능을 제공, 총 수를 얻는 것입니다.

    db.posts.aggregate([
      { $match: { public: true },
      { $lookup: {
        from: 'users',
        localField: 'userId',
        foreignField: 'userId',
        as: 'userInfo'
      } },
      { $project: {
        postId: 1,
        title: 1,
        description: 1
        updated: 1,
        userInfo: {
          $let: {
            vars: {
              firstUser: {
                $arrayElemAt: ['$userInfo', 0]
              }
            },
            in: {
              username: '$$firstUser.username'
            }
          }
        }
      } },
      { $sort: { updated: -1 } },
      { $group: {
        _id: null,
        postCount: { $sum: 1 },
        posts: {
          $push: '$$ROOT'
        }
      } },
      { $project: {
        _id: 0,
        postCount: 1,
        posts: {
          $slice: [
            '$posts',
            currentPage ? (currentPage - 1) * RESULTS_PER_PAGE : 0,
            RESULTS_PER_PAGE
          ]
        }
      } }
    ])
    
  4. ==============================

    4.MongoDB를 3.4에서 방법이 : $면

    MongoDB를 3.4에서 방법이 : $면

    넌 할 수있어

    db.collection.aggregate([
      {
        $facet: {
          data: [{ $match: {} }],
          total: { $count: 'total' }
        }
      }
    ])
    

    당신은 동시에 두 개의 집계를 실행할 수 있습니다

  5. ==============================

    5.그것은 모두 당신이 두 개의 질의를 할 필요가 있는지 여부에 관하여 필요한 매김 경험에 따라 달라집니다.

    그것은 모두 당신이 두 개의 질의를 할 필요가 있는지 여부에 관하여 필요한 매김 경험에 따라 달라집니다.

    당신은 모든 단일 페이지 또는 페이지도 범위가 목록에 필요합니까? 사람은 심지어 페이지 1051로 이동 하는가 - 개념적으로 실제로 평균을 무엇?

    프로그래머는 매김의 패턴에 UX를 많이하고 - 매김 커버의 고통 다양한 매김의 유형과 시나리오를 피 프로그래머 경우 다음 페이지를 알고 카운트 쿼리를 필요로하지 않는 많은. 예를 들어, 당신은 한 페이지에 10 개 개의 항목을 표시 할 경우 당신은 13 제한 - 당신이 프로그래머 경우 다른 페이지를 알 수 있습니다 ..

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

    6.MongoDB를 사용하면 제한 ()를 전달하거나 건너 뛸 경우에도) (당신이 cursor.count을 사용할 수 있습니다 ().

    MongoDB를 사용하면 제한 ()를 전달하거나 건너 뛸 경우에도) (당신이 cursor.count을 사용할 수 있습니다 ().

    당신이 10 개 항목과 db.collection이 있다고 할 수 있습니다.

    넌 할 수있어:

    async function getQuery() {
      let query = await db.collection.find({}).skip(5).limit(5); // returns last 5 items in db
      let countTotal = await query.count() // returns 10-- will not take `skip` or `limit` into consideration
      let countWithConstraints = await query.count(true) // returns 5 -- will take into consideration `skip` and `limit`
      return { query, countTotal } 
    }
    
  7. ==============================

    7.당신은 한 쿼리에서이 작업을 수행 할 수 있습니다. 먼저 수를 실행하고 그 내에서 제한 () 함수를 실행합니다.

    당신은 한 쿼리에서이 작업을 수행 할 수 있습니다. 먼저 수를 실행하고 그 내에서 제한 () 함수를 실행합니다.

    Node.js를하고 Express.js에서는 toArray의 "결과"와 함께 "계산"기능을 사용할 수 있도록 다음과 같이 사용해야합니다.

    var curFind = db.collection('tasks').find({query});
    

    그럼 당신이 (다른 중첩 한)처럼 이후에 두 가지 기능을 실행할 수 있습니다

    curFind.count(function (e, count) {
    
    // Use count here
    
        curFind.skip(0).limit(10).toArray(function(err, result) {
    
        // Use result here and count here
    
        });
    
    });
    
  8. ==============================

    8.여기에 대답으로는 한계 ()를 사용하여 수 ()의 영향없이 전체 결과 크기를 얻을 수 있습니다 : MongoDB의 결과를 제한하지만 여전히 전체 수를 점점?

    여기에 대답으로는 한계 ()를 사용하여 수 ()의 영향없이 전체 결과 크기를 얻을 수 있습니다 : MongoDB의 결과를 제한하지만 여전히 전체 수를 점점?

    문서에 따르면, 당신은 () 수를 호출 할 때 제한 / 매김을 고려할지 여부를 제어 할 수 있습니다 : https://docs.mongodb.com/manual/reference/method/cursor.count/#cursor.count

    편집 : 다른 곳에 기록 된 것과 대조적으로 - 워드 프로세서 것을 분명히 상태 "작업 대신 쿼리를 수행하지 않지만 쿼리에 의해 반환되는 결과를 계산합니다." 어느 - 나의 이해에서 - 하나의 쿼리가 실행되는 방법.

    예:

    > db.createCollection("test")
    { "ok" : 1 }
    
    > db.test.insert([{name: "first"}, {name: "second"}, {name: "third"}, 
    {name: "forth"}, {name: "fifth"}])
    BulkWriteResult({
        "writeErrors" : [ ],
        "writeConcernErrors" : [ ],
        "nInserted" : 5,
        "nUpserted" : 0,
        "nMatched" : 0,
        "nModified" : 0,
        "nRemoved" : 0,
        "upserted" : [ ]
    })
    
    > db.test.find()
    { "_id" : ObjectId("58ff00918f5e60ff211521c5"), "name" : "first" }
    { "_id" : ObjectId("58ff00918f5e60ff211521c6"), "name" : "second" }
    { "_id" : ObjectId("58ff00918f5e60ff211521c7"), "name" : "third" }
    { "_id" : ObjectId("58ff00918f5e60ff211521c8"), "name" : "forth" }
    { "_id" : ObjectId("58ff00918f5e60ff211521c9"), "name" : "fifth" }
    
    > db.test.count()
    5
    
    > var result = db.test.find().limit(3)
    > result
    { "_id" : ObjectId("58ff00918f5e60ff211521c5"), "name" : "first" }
    { "_id" : ObjectId("58ff00918f5e60ff211521c6"), "name" : "second" }
    { "_id" : ObjectId("58ff00918f5e60ff211521c7"), "name" : "third" }
    
    > result.count()
    5 (total result size of the query without limit)
    
    > result.count(1)
    3 (result size with limit(3) taken into account)
    
  9. ==============================

    9.다음과 같이하십시오 :

    다음과 같이하십시오 :

    core.db.users.find(query, {}, {skip:0, limit:1}, function(err, cursor){
        if(err)
            return callback(err);
    
        cursor.toArray(function(err, items){
            if(err)
                return callback(err);
    
            cursor.count(false, function(err, total){
                if(err)
                    return callback(err);
    
                console.log("cursor", total)
    
                callback(null, {items: items, total:total})
            })
        })
     })
    
  10. ==============================

    10.당신은 총 수를 얻을 수 cursor.count ()를 사용할 수 있습니다

    당신은 총 수를 얻을 수 cursor.count ()를 사용할 수 있습니다

     const cursor = await database.collection(collectionName).find(query).skip(offset).limit(limit)
     return {
        data: await cursor.toArray(),
        count: await cursor.count() // this will give count of all the documents before .skip() and limit()
     };
    
  11. from https://stackoverflow.com/questions/21803290/get-a-count-of-total-documents-with-mongodb-when-using-limit by cc-by-sa and MIT license