MongoDB의 모든 아이들을 어떻게 얻을 수 있습니까?
MongoDB에 있는 모든 아이들의 배열을 어떻게 얻을 수 있습니까?나는 ID 세트만 필요하고 문서 내용은 필요하지 않습니다.
다음과 같이 커서를 호출하여 Mongo 셸에서 이 작업을 수행할 수 있습니다.
var a = db.c.find({}, {_id:1}).map(function(item){ return item._id; })
그 결과는a
의 배열입니다._id
가치.
노드에서 작동하는 방식도 비슷합니다.
(MongoDB 노드 드라이버입니다.v2.2
및 노드v6.7.0
)
db.collection('...')
.find(...)
.project( {_id: 1} )
.map(x => x._id)
.toArray();
기억하세요map
전에 toArray
이와 같이map
JavaScript가 아닙니다.map
MongoDB에서 제공하는 기능이며 커서가 반환되기 전에 데이터베이스 내에서 실행됩니다.
한 가지 방법은 단순히 runCommand API를 사용하는 것입니다.
db.runCommand ( { distinct: "distinct", key: "_id" } )
다음과 같은 것을 얻을 수 있습니다.
{
"values" : [
ObjectId("54cfcf93e2b8994c25077924"),
ObjectId("54d672d819f899c704b21ef4"),
ObjectId("54d6732319f899c704b21ef5"),
ObjectId("54d6732319f899c704b21ef6"),
ObjectId("54d6732319f899c704b21ef7"),
ObjectId("54d6732319f899c704b21ef8"),
ObjectId("54d6732319f899c704b21ef9")
],
"stats" : {
"n" : 7,
"nscanned" : 7,
"nscannedObjects" : 0,
"timems" : 2,
"cursor" : "DistinctCursor"
},
"ok" : 1
}
하지만, 실제를 사용하는 훨씬 더 좋은 방법이 있습니다.distinct
API:
var ids = db.distinct.distinct('_id', {}, {});
일련의 ID를 제공합니다.
[
ObjectId("54cfcf93e2b8994c25077924"),
ObjectId("54d672d819f899c704b21ef4"),
ObjectId("54d6732319f899c704b21ef5"),
ObjectId("54d6732319f899c704b21ef6"),
ObjectId("54d6732319f899c704b21ef7"),
ObjectId("54d6732319f899c704b21ef8"),
ObjectId("54d6732319f899c704b21ef9")
]
첫 번째 버전은 확실하지 않지만, 후자는 확실히 Node.js 드라이버에서 지원됩니다(사용하고 싶다고 말씀하신 것을 보았습니다).이는 다음과 같습니다.
db.collection('c').distinct('_id', {}, {}, function (err, result) {
// result is your array of ids
})
또한 MongoDB 노드를 사용하여 이 작업을 수행하는 방법도 궁금합니다.@user2793120과 같은 JS 드라이버.다른 사람이 결과를 .로 반복해야 한다고 말했는데, 이는 저에게 매우 비효율적으로 보였습니다.대신 MongoDB의 집계를 사용했습니다.
myCollection.aggregate([
{$match: {ANY SEARCHING CRITERIA FOLLOWING $match'S RULES} },
{$sort: {ANY SORTING CRITERIA, FOLLOWING $sort'S RULES}},
{$group: {_id:null, ids: {$addToSet: "$_id"}}}
]).exec()
정렬 단계는 선택 사항입니다.모든 컬렉션의 _ids를 원하는 경우에도 일치합니다.결과를 console.log로 기록하면 다음과 같은 결과가 나타납니다.
[ { _id: null, ids: [ '56e05a832f3caaf218b57a90', '56e05a832f3caaf218b57a91', '56e05a832f3caaf218b57a92' ] } ]
그런 다음 결과[0]ids의 내용을 다른 곳에서 사용하십시오.
여기서 중요한 부분은 $group 섹션입니다._id에 대한 null 값을 정의하고(그렇지 않으면 집계가 중단됨) 모든 _id를 사용하여 새 배열 필드를 생성해야 합니다.중복된 ID가 있어도 상관없다면($match 단계에서 사용된 검색 기준에 따라), _id 이외의 필드를 그룹화하고 있으며 다른 문서 _id도 있다고 가정하면 $addToSet 대신 $push를 사용할 수 있습니다.
mongo 콘솔에서 이 작업을 수행하는 또 다른 방법은 다음과 같습니다.
var arr=[]
db.c.find({},{_id:1}).forEach(function(doc){arr.push(doc._id)})
printjson(arr)
그게 도움이 되길 바랍니다!!!
감사합니다!!!
저는 이것에 대해 오랫동안 고심했고, 중요한 힌트가 있어서 이렇게 대답합니다.다음과 같은 것이 명백했습니다.
db.c.find({},{_id:1});
그게 답이 될 겁니다
효과가 있었어요.처음 101개의 문서를 찾은 다음 응용프로그램이 일시 중지됩니다.계속하게 놔두지 않았어요.이것은 MongoOperations를 사용하는 Java와 Mongo 명령줄 모두에서 발생했습니다.
저는 몽고 로그를 보고 큰 문서들의 콜스캔을 하고 있는 것을 보았습니다.저는 미친 듯이 항상 색인화된 _id를 투영하고 있는데 왜 콜스캔을 시도할까 생각했습니다.
왜 그렇게 되는지는 모르겠지만, 해결책은 간단합니다.
db.c.find({},{_id:1}).hint({_id:1});
또는 Java:
query.withHint("{_id:1}");
그런 다음 스트림 스타일을 사용하여 정상적으로 진행할 수 있었습니다.
createStreamFromIterator(mongoOperations.stream(query, MortgageDocument.class)).
map(MortgageDocument::getId).forEach(transformer);
몽고는 좋은 일을 할 수 있고 정말 혼란스러운 방식으로 갇힐 수도 있습니다.적어도 지금까지 제 경험은 그렇습니다.
다음과 같은 집계 파이프라인을 사용해 보십시오.
db.collection.aggregate([
{ $match: { deletedAt: null }},
{ $group: { _id: "$_id"}}
])
이 gon은 이 구조를 가진 문서 배열을 반환합니다.
_id: ObjectId("5fc98977fda32e3458c97edd")
저는 5천만 개 이상의 행이 있는 컬렉션에 대한 ID를 얻기 위해 비슷한 요구 사항이 있었습니다.여러 가지 방법을 시도했습니다.ID를 얻는 가장 빠른 방법은 ID만으로 mongoexport를 하는 것으로 밝혀졌습니다.
위의 예 중 하나가 저에게 효과가 있었고, 약간의 수정이 있었습니다.Mongoose 스키마를 사용할 때 두 번째 개체를 빠뜨렸습니다.
const idArray = await Model.distinct('_id', {}, function (err, result) {
// result is your array of ids
return result;
});
Kotlin 및 Spring 데이터를 위한 솔루션.
모든 문서를 가져오고 문서에서 ID를 가져오는 간단한 솔루션:
// Defining the Repository.
@Repository
interface MyRepository : MongoRepository<MyDocument, String> {
}
// Fetching the IDs.
val ids: List<String> = myRepository.findAll().mapNotNull { it._id }
MongoDB Aggregation 기능을 사용하여 ID만 가져오는 최적화된 솔루션:
// Defining the Repository.
@Repository
interface MyRepository : MongoRepository<MyDocument, String> {
@Aggregation(pipeline = [
"{ '\$project': { '_id': 1 } }"
])
fun findAllIds(): List<String>
}
// Fetching the IDs.
val ids: List<String> = myRepository.findAllIds()
언급URL : https://stackoverflow.com/questions/18881982/how-can-i-get-all-the-doc-ids-in-mongodb
'programing' 카테고리의 다른 글
스키마 이름을 변경하는 방법? (0) | 2023.07.15 |
---|---|
XAML - 'Content' 속성이 두 번 이상 설정되었습니다. (0) | 2023.07.15 |
중첩된 객체 배열 정렬 (0) | 2023.07.15 |
pdb를 종료하고 프로그램을 계속 진행하려면 어떻게 해야 합니까? (0) | 2023.07.15 |
git update-index --discovery-discovery가 "파일을 표시할 수 없음"을 반환합니다. (0) | 2023.07.15 |