source

배열 길이별 Mongo 순서

bestscript 2023. 5. 20. 23:40

배열 길이별 Mongo 순서

다음과 같은 mongo 문서가 있다고 가정해 보겠습니다.

질문 1

{
    answers:[
       {content: 'answer1'},
       {content: '2nd answer'}
    ]
}

질문 2

{
    answers:[
       {content: 'answer1'},
       {content: '2nd answer'}
       {content: 'The third answer'}
    ]
}

답변 크기별로 컬렉션을 주문할 수 있는 방법이 있습니까?

약간의 조사 후 다른 분야를 추가하자는 제안을 보았습니다. 여기에는 많은 답변이 포함되어 있고 참조용으로 사용할 수 있지만 기본적인 방법이 있을 수도 있습니다.

저는 당신이 사용할 수 있을 거라고 생각했습니다.$size하지만 그것은 특정 크기의 배열을 찾는 것일 뿐이지 주문하는 것은 아닙니다.

mongo 설명서에서: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24size

$size를 사용하여 크기 범위(예: 요소가 하나 이상인 배열)를 찾을 수 없습니다.범위를 쿼리해야 하는 경우 요소를 추가할 때 증분하는 추가 크기 필드를 만듭니다.다른 쿼리 식이 포함된 경우 쿼리 식의 해당 부분에서 일치하는 항목을 검색하는 데 사용될 수 있지만 쿼리의 $size 부분에는 인덱스를 사용할 수 없습니다.

아직 출시되지 않은 새로운 집계 프레임워크인 편집을 통해 이 작업을 상당히 쉽게 수행할 수 있을 것으로 보입니다.http://www.mongodb.org/display/DOCS/Aggregation+Framework

이제 업데이트 집계 프레임워크가 종료되었습니다...

> db.test.aggregate([
  {$unwind: "$answers"}, 
  {$group: {_id:"$_id", answers: {$push:"$answers"}, size: {$sum:1}}}, 
  {$sort:{size:1}}]);
{
"result" : [
    {
        "_id" : ObjectId("5053b4547d820880c3469365"),
        "answers" : [
            {
                "content" : "answer1"
            },
            {
                "content" : "2nd answer"
            }
        ],
        "size" : 2
    },
    {
        "_id" : ObjectId("5053b46d7d820880c3469366"),
        "answers" : [
            {
                "content" : "answer1"
            },
            {
                "content" : "2nd answer"
            },
            {
                "content" : "The third answer"
            }
        ],
        "size" : 3
    }
  ],
  "ok" : 1
}

사용합니다$project이 경우:

db.test.aggregate([
    {
        $project : { answers_count: {$size: { "$ifNull": [ "$answers", [] ] } } }
    }, 
    {   
        $sort: {"answers_count":1} 
    }
])

또한 빈 답변이 있는 문서를 포함할 수 있습니다.그러나 다음과 같은 단점도 있습니다. 필요한 모든 필드를 수동으로 추가해야 합니다.$project걸음.

mongodb 집계 단계를 사용할 수 있습니다.$addFields저장 개수에 추가 필드를 추가한 다음$sort단계.

db.test.aggregate([
    {
        $addFields: { answers_count: {$size: { "$ifNull": [ "$answers", [] ] } } }
    }, 
    {   
        $sort: {"answers_count":1} 
    }
])

$size 특성을 사용하여 배열 길이별로 정렬할 수 있습니다.

db.getCollection('test').aggregate([
{$project: { "answers": 1, "answer_count": { $size: "$answers" } }},
{$sort: {"answer_count": -1}}])

언급URL : https://stackoverflow.com/questions/9040161/mongo-order-by-length-of-array