programing

중첩된 객체 배열 정렬

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

중첩된 객체 배열 정렬

중첩된 개체 배열을 정렬하는 방법을 찾고 있습니다.

다음은 예입니다.

{
  answers : [
    { name : 'paul',  state : 'RU' },
    { name : 'steve', state : 'US' }, 
    { name : 'mike',  state : 'DE' }, 
    ...
  ]
}

지금 내가 모든 것을 찾고 있다고 가정해 보세요.name,의answers배열, 하지만 어떻게 오름차순으로 정렬할 수 있습니까?

당신이 원하는 순서대로 보관하겠습니다.아니면 클라이언트 쪽에서 꺼낸 후에 정렬합니다.

다 불가능한 경우 집계 프레임워크를 사용할 수 있습니다.

> db.test.insert({answers: [
...                 {name: 'paul', state: 'RU'},
...                 {name: 'steve', state: 'US'}, 
...                 {name: 'mike', state: 'DE'}]});
> db.test.insert({answers: [
...                 {name: 'paul', state: 'RU'},
...                 {name: 'steve', state: 'US'}, 
...                 {name: 'xavier', state: 'TX'}]});

db.test.aggregate([
  {$unwind: "$answers"}, 
  {$sort: {"answers.name":1}}, 
  {$group: {_id:"$_id", answers: {$push:"$answers"}}}
]);

생성물:

{
  "result" : [
  {
    "_id" : ObjectId("5053b2477d820880c3469364"),
    "answers" : [
      {
        "name" : "paul",
        "state" : "RU"
      },
      {
        "name" : "steve",
        "state" : "US"
      },
      {
        "name" : "xavier",
        "state" : "TX"
      }
    ]
  },
  {
    "_id" : ObjectId("5053af9f7d820880c3469363"),
    "answers" : [
      {
        "name" : "mike",
        "state" : "DE"
      },
      {
        "name" : "paul",
        "state" : "RU"
      },
      {
        "name" : "steve",
        "state" : "US"
      }
    ]
  }
],
  "ok" : 1
}

이런 상황에서 도움이 되지 않을 수도 있지만, 저는 이것을 추가해야겠다고 생각했습니다.두 가지 이상의 방법으로 정렬할 필요가 없는 비정규화된 컬렉션에 적합한 쓰기에서 정렬할 수도 있습니다.

사용자에 대한 피드를 만들 때 앱에서 이 상황을 발견했습니다.

Meteor.users.helpers({
  'addToFeed': function (gameId, pushData) {
    check(pushData, FeedSchema);
    Meteor.users.update({
      _id: this._id,
      "games.gameId": gameId
    }, {
      $push: {
        "games.$.feed": {
          $each: [pushData],
          $sort: { timestamp: -1 }
        }
      }
    });
  }
});

저는 당신이 그것을 사용할 수 있기 때문에 그것이 꽤 편리하다는 것을 알았습니다.find()기본적으로 사양별로 정렬됩니다.

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

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

// {
//   "answers" : [
//     { "name" : "steve",  "state" : "US" },
//     { "name" : "xavier", "state" : "FR" },
//     { "name" : "paul",   "state" : "RU" }
//   ]
// }
db.collection.aggregate(
  { $set:
    { "answers":
      { $function: {
          body: function(answers) { return answers.sort((a, b) => a.name > b.name); },
          args: ["$answers"],
          lang: "js"
      }}
    }
  }
)
// {
//   "answers" : [
//     { "name" : "paul",   "state" : "RU" },
//     { "name" : "steve",  "state" : "US" },
//     { "name" : "xavier", "state" : "FR" }
//   ]
// }

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

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

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

mongodb 버전 5.2 이후로는$sortArray:

db.engineers.aggregate([
   {$set:
     {answers: {$sortArray: {input: "$answers ", sortBy: { name: 1 } }}}
   }
])

중첩된 어레이를 업데이트하는 동안 이에 대한 솔루션을 하나 찾았습니다. 업데이트 후 정렬된 어레이가 있으므로 찾을 때 정렬할 필요가 없습니다.

db.students.update(
   { _id: 1 },
   {
     $push: {
       quizzes: {
         $each: [ `enter code here`{ id: 3, score: 8 }, { id: 4, score: 7 }, { id: 5, score: 6 } ],
         $sort: { score: 1 }
       }
     }
   }
)

find()를 수행한 후에는 반환 값에 sort()를 사용할 수 있습니다.

db.collection.find({},{"answers.name":1}).sort({"answers.name":1})

찾기는 컬렉션에 있는 모든 문서의 이름 필드를 추출합니다.그런 다음 정렬은 이름별로 정렬하고 오름차순으로 정렬합니다.

http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order

언급URL : https://stackoverflow.com/questions/12432727/sort-nested-array-of-objects

반응형