programing

MongoDB의 모든 아이들을 어떻게 얻을 수 있습니까?

abcjava 2023. 7. 15. 00:28
반응형

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이와 같이mapJavaScript가 아닙니다.mapMongoDB에서 제공하는 기능이며 커서가 반환되기 전에 데이터베이스 내에서 실행됩니다.

한 가지 방법은 단순히 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
}

하지만, 실제를 사용하는 훨씬 더 좋은 방법이 있습니다.distinctAPI:

 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

반응형