[MONGODB] 제한을 사용할 때 MongoDB를 가진 총 문서의 수를 가져옵니다
MONGODB제한을 사용할 때 MongoDB를 가진 총 문서의 수를 가져옵니다
나는 MongoDB를 함께 일하고 있어요는 "매김"솔루션을 최적화에 관심이 있어요. 내 문제는 정직이다. 나는 보통 문서의 수는 제한 () 기능을 사용하여 반환 제한합니다. 나는 그들이 추가 요청을 발행해야합니다 알려주는 클라이언트에 그에게 전달할 수 있도록 나 또한 쿼리 문서의 총 수를 캡처하는이 힘 나를 위해 제한 () 기능이없는 중복 쿼리를 실행합니다 (들)은 문서의 나머지 부분을 검색 할 수 있습니다.
1 개 쿼리에이 응축 할 수있는 방법이 있나요? () 문서의 총 수를 가져옵니다 만, 동시에 일부 사용 제한을 검색? 내가 접근하고보다이 문제에 대해 생각하는 다른 방법이 있나요?
해결법
-
==============================
1.아니, 다른 방법이 없습니다. 두 쿼리 - 카운트 하나 - 제한 한. 또는 당신은 다른 데이터베이스를 사용합니다. 당신이 원하는 것처럼 예를 들어 아파치 SOLR 작동합니다. 모든 쿼리가 제한 반환에서는 totalCount된다.
아니, 다른 방법이 없습니다. 두 쿼리 - 카운트 하나 - 제한 한. 또는 당신은 다른 데이터베이스를 사용합니다. 당신이 원하는 것처럼 예를 들어 아파치 SOLR 작동합니다. 모든 쿼리가 제한 반환에서는 totalCount된다.
-
==============================
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.시간이 변경되었습니다, 나는 당신이 영업 이익은 $ 종류, $ 그룹과 $ 프로젝트 집계를 사용하여 요구하고 무엇을 달성 할 수 있다고 생각합니다. 내 시스템의 경우, 나는 또한 내 사용자 컬렉션에서 일부 사용자 정보를 잡아 필요가 있었다. 희망이뿐만 아니라 그 주변의 모든 질문에 응답 할 수 있습니다. 다음은 집계 파이프입니다. 마지막 세 개체 (종류, 그룹 프로젝트) 핸들 다음 페이지 매김 기능을 제공, 총 수를 얻는 것입니다.
시간이 변경되었습니다, 나는 당신이 영업 이익은 $ 종류, $ 그룹과 $ 프로젝트 집계를 사용하여 요구하고 무엇을 달성 할 수 있다고 생각합니다. 내 시스템의 경우, 나는 또한 내 사용자 컬렉션에서 일부 사용자 정보를 잡아 필요가 있었다. 희망이뿐만 아니라 그 주변의 모든 질문에 응답 할 수 있습니다. 다음은 집계 파이프입니다. 마지막 세 개체 (종류, 그룹 프로젝트) 핸들 다음 페이지 매김 기능을 제공, 총 수를 얻는 것입니다.
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.MongoDB를 3.4에서 방법이 : $면
MongoDB를 3.4에서 방법이 : $면
넌 할 수있어
db.collection.aggregate([ { $facet: { data: [{ $match: {} }], total: { $count: 'total' } } } ])
당신은 동시에 두 개의 집계를 실행할 수 있습니다
-
==============================
5.그것은 모두 당신이 두 개의 질의를 할 필요가 있는지 여부에 관하여 필요한 매김 경험에 따라 달라집니다.
그것은 모두 당신이 두 개의 질의를 할 필요가 있는지 여부에 관하여 필요한 매김 경험에 따라 달라집니다.
당신은 모든 단일 페이지 또는 페이지도 범위가 목록에 필요합니까? 사람은 심지어 페이지 1051로 이동 하는가 - 개념적으로 실제로 평균을 무엇?
프로그래머는 매김의 패턴에 UX를 많이하고 - 매김 커버의 고통 다양한 매김의 유형과 시나리오를 피 프로그래머 경우 다음 페이지를 알고 카운트 쿼리를 필요로하지 않는 많은. 예를 들어, 당신은 한 페이지에 10 개 개의 항목을 표시 할 경우 당신은 13 제한 - 당신이 프로그래머 경우 다른 페이지를 알 수 있습니다 ..
-
==============================
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.당신은 한 쿼리에서이 작업을 수행 할 수 있습니다. 먼저 수를 실행하고 그 내에서 제한 () 함수를 실행합니다.
당신은 한 쿼리에서이 작업을 수행 할 수 있습니다. 먼저 수를 실행하고 그 내에서 제한 () 함수를 실행합니다.
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.여기에 대답으로는 한계 ()를 사용하여 수 ()의 영향없이 전체 결과 크기를 얻을 수 있습니다 : 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.다음과 같이하십시오 :
다음과 같이하십시오 :
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.당신은 총 수를 얻을 수 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() };
from https://stackoverflow.com/questions/21803290/get-a-count-of-total-documents-with-mongodb-when-using-limit by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] MongoDB의 : 배열 요소의 특성에 고유 색인 (0) | 2019.12.02 |
---|---|
[MONGODB] MongoDB의 쿼리의 키에 와일드 (0) | 2019.12.02 |
[MONGODB] 왜 몽구스는 항상 내 컬렉션 이름의 마지막에 S를 추가 않습니다 (0) | 2019.12.02 |
[MONGODB] Meteor.js와 여러 MongoDB의 데이터베이스를 사용하여 (0) | 2019.12.02 |
[MONGODB] 피 경고 true로 useNewUrlParser을 설정하여 "현재의 URL 문자열 파서는 사용되지 않습니다" (0) | 2019.12.02 |