sourcecode

Mongodb 정렬 내부 배열

copyscript 2023. 6. 8. 22:26
반응형

Mongodb 정렬 내부 배열

저는 지금 한참 동안 찾고 있는데 내부 배열을 분류하여 현재 작업 중인 문서에 보관할 수 없는 것 같습니다.

{
    "service": {
        "apps": {
            "updates": [
              {
                "n" : 1
                "date": ISODate("2012-03-10T16:15:00Z")
              },
              {
                "n" : 2
                "date": ISODate("2012-01-10T16:15:00Z")
              },
              {
                "n" : 5
                "date": ISODate("2012-07-10T16:15:00Z")
              }
            ]
        }
     }
 }

그래서 저는 서비스로 반환되는 항목을 유지하면서 업데이트 배열을 정렬하고 싶습니다.지금까지 나는 껍데기를 가지고 있습니다.

db.servers.aggregate(
        {$unwind:'$service'},
        {$project:{'service.apps':1}},
        {$unwind:'$service.apps'}, 
        {$project: {'service.apps.updates':1}}, 
        {$sort:{'service.apps.updates.date':1}});

이 일을 도와줄 사람?

이 작업을 수행할 수 있습니다.$unwinding theupdates배열, 결과 문서 정렬 기준date,그리고 나서.$group그들을 다시 연결하는 것_id정렬된 순서를 사용합니다.

db.servers.aggregate(
    {$unwind: '$service.apps.updates'}, 
    {$sort: {'service.apps.updates.date': 1}}, 
    {$group: {_id: '$_id', 'updates': {$push: '$service.apps.updates'}}}, 
    {$project: {'service.apps.updates': '$updates'}})

시작 위치Mongo 4.4집계 연산자는 사용자 정의 Javascript 함수를 적용하여 MongoDB 쿼리 언어에서 지원되지 않는 동작을 구현할 수 있습니다.

예를 들어, 필드 중 하나를 기준으로 개체 배열을 정렬하려면 다음과 같이 하십시오.

// {
//   "service" : { "apps" : { "updates" : [
//     { "n" : 1, "date" : ISODate("2012-03-10T16:15:00Z") },
//     { "n" : 2, "date" : ISODate("2012-01-10T16:15:00Z") },
//     { "n" : 5, "date" : ISODate("2012-07-10T16:15:00Z") }
//   ]}}
// }
db.collection.aggregate(
  { $set: {
    { "service.apps.updates":
      { $function: {
          body: function(updates) {
            updates.sort((a, b) => a.date - b.date);
            return updates;
          },
          args: ["$service.apps.updates"],
          lang: "js"
      }}
    }
  }
)
// {
//   "service" : { "apps" : { "updates" : [
//     { "n" : 2, "date" : ISODate("2012-01-10T16:15:00Z") },
//     { "n" : 1, "date" : ISODate("2012-03-10T16:15:00Z") },
//     { "n" : 5, "date" : ISODate("2012-07-10T16:15:00Z") }
//   ]}}
// }

이렇게 하면 비용이 많이 드는 조합을 적용할 필요 없이 어레이를 수정할 수 있습니다.$unwind,$sort그리고.$group단상들

$function세 가지 매개 변수를 사용합니다.

  • body매개 변수가 수정할 배열인 적용할 함수입니다.
  • args여기에는 레코드의 필드가 포함되어 있습니다.body함수는 매개 변수로 사용됩니다.우리의 경우에는"$service.apps.updates".
  • lang그것이 그 언어입니다.body함수가 작성되었습니다.오직.js현재 사용할 수 있습니다.

시작 위치Mongo 5.2새로운 집계 연산자의 정확한 사용 사례입니다.

// {
//   service: { apps: { updates: [
//     { n: 1, date: ISODate("2012-03-10") },
//     { n: 2, date: ISODate("2012-01-10") },
//     { n: 5, date: ISODate("2012-07-10") }
//   ]}}
// }
db.collection.aggregate([
  { $set: {
    "service.apps.updates": {
      $sortArray: {
        input: "$service.apps.updates",
        sortBy: { date: 1 }
      }
    }
  }}
])
// {
//   service: { apps: { updates: [
//     { n: 2, date: ISODate("2012-01-10") },
//     { n: 1, date: ISODate("2012-03-10") },
//     { n: 5, date: ISODate("2012-07-10") }
//   ]}}
// }

다음 항목:

  • 분류($sortArray) 그service.apps.updates배열(input: "$service.apps.updates")
  • 에 정렬을 적용함으로써.dates(sortBy: { date: 1 })
  • 고가의 조합을 적용할 필요 없이$unwind,$sort그리고.$group단계들

언급URL : https://stackoverflow.com/questions/15388127/mongodb-sort-inner-array

반응형