중첩된 객체 배열 정렬
중첩된 개체 배열을 정렬하는 방법을 찾고 있습니다.
다음은 예입니다.
{
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
'programing' 카테고리의 다른 글
XAML - 'Content' 속성이 두 번 이상 설정되었습니다. (0) | 2023.07.15 |
---|---|
MongoDB의 모든 아이들을 어떻게 얻을 수 있습니까? (0) | 2023.07.15 |
pdb를 종료하고 프로그램을 계속 진행하려면 어떻게 해야 합니까? (0) | 2023.07.15 |
git update-index --discovery-discovery가 "파일을 표시할 수 없음"을 반환합니다. (0) | 2023.07.15 |
고급 사용자 지정 필드 / 다른 acf 필드를 기준으로 채우기 선택 (0) | 2023.07.15 |