programing

실제 숫자인 문자열 값을 기준으로 Mongo 정렬

i4 2023. 7. 10. 22:01
반응형

실제 숫자인 문자열 값을 기준으로 Mongo 정렬

다음과 같은 개체가 포함된 컬렉션이 있습니다.

{ 
    "_id" : ObjectId("57f00cf47958af95dca29c0c"), 
    "id" : "...", 
    "threadId" : "...", 
    "ownerEmail" : "...@...", 
    "labelIds" : [
       ...
    ], 
    "snippet" : "...", 
    "historyId" : "35699995", 
    "internalDate" : "1422773000000", 
    "headers" : {
        "from" : "...@...", 
        "subject" : "....", 
        "to" : "...@..."
    }, 
    "contents" : {
        "html" : "...."
    }
}

개체에 액세스할 때 정수여야 하는 iternalDate 값을 기준으로 정렬하고 싶지만 문자열입니다.이것들이 현이더라도 가져올 때 분류할 수 있는 방법이 있나요?알파벳순으로?아니면 고통 없이 정수로 변환할 수 있는 방법이 있습니까?

당신에게 필요한 것은 조합입니다.

db.collection.find()
  .sort({internalDate: 1})
  .collation({locale: "en_US", numericOrdering: true})

여기서 가장 좋은 해결책은 먼저 정수로 구문 분석하는 것입니다.노드에 mongodb 클라이언트를 사용하여 다음과 같은 Javascript의 간단한 스크립트를 사용하여 이 작업을 수행할 수 있습니다.

db.collection.find({}, {internalDate: 1}).forEach(function(doc) {
    db.collection.update(
       { _id: doc._id },
       { $set: { internalDate: parseInt(doc.internalDate) } }
    )
})

집계 방법을 사용하여 실제 문자열인 숫자를 정렬할 수도 있습니다.

 db.collection.aggregate([{
     $sort : {
          internalDate : 1
     }
 }], {
     collation: {
         locale: "en_US",
         numericOrdering: true
     }
 });

서버 사이드 페이지에 mongoose-continate 패키지를 사용하고 있으므로 이 패키지를 사용하지 마십시오. 서버 사이드 페이지에 mongoose-continate-v2만 사용하십시오.nodejs 측을 위한 이 패키지

저는 이 문제를 겪고 있었습니다.문자열 길이를 사용하여 먼저 정렬한 다음 문자열처럼 저장된 숫자 값의 종류(예: "1", "100", "20", "3")를 1, 3, 29, 100처럼 정렬해야 합니다.

    db.AllTours.aggregate([
    {
        $addFields : {
            "MyStringValueSize" : { $strLenCP: "$MyValue" }
        }
    },
    { 
        $sort : { 
            "MyStringValueSize" : 1,
            "MyValue" : 1
        } 
    }
    ]);

버전 4.0에는 문자열을 구문 분석한 다음 정렬하는 데 사용할 수 있는 $toInt라는 새로운 기능이 있습니다.저의 경우 3.6에서 업그레이드할 수 없습니다.

종합적으로 말하면, 이것은 저에게 효과가 있습니다.

db.collection.aggregate([<pipeline>]).collation({locale:"en_US", numericOrdering:true})

이것이 나의 해결책이고 나에게 효과가 있었습니다.

db.getCollection('myCollection').aggregate([
{
    $project: {
        newMonth: {
            $cond: { if: {
                $and: [
                    {$ne: ['$month', '10']},
                    {$ne: ['$month', '11']},
                    {$ne: ['$month', '12']},
                ]
            }, then: {$concat: ['0', '$month']}, else: '$month' }
        }
        }
    },

    {
        $sort: {newMonth: -1}
    }
])

언급URL : https://stackoverflow.com/questions/39815265/mongo-sort-by-string-value-that-is-actually-number

반응형