MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

сортиране на масив в заявка и проектиране на всички полета

Тъй като групирате в документа _id можете просто да поставите полетата, които искате да запазите, в групата _id . След това можете да оформите отново, като използвате $project

db.c.aggregate([
    { "$unwind": "$array_to_sort"},
    { "$sort": {"array_to_sort.b":1, "array_to_sort:a": 1}},
    { "$group": { 
        "_id": {
            "_id": "$_id",
            "unknown_field": "$unknown_field"
        },
        "Oarray_to_sort": { "$push":"$array_to_sort"}
    }},
    { "$project": {
        "_id": "$_id._id",
        "unknown_field": "$_id.unknown_field",
        "array_to_sort": "$Oarray_to_sort"
    }}
]);

Другият "трик" там е използването на временно име за масива в етапа на групиране. Това е така, когато $project и промените името, получавате полетата в реда, посочен в изявлението за проекция. Ако не сте го направили, полето "array_to_sort" няма да е последното поле в реда, тъй като е копирано от предишния етап.

Това е предвидена оптимизация в $project , но ако искате реда, можете да го направите както по-горе.

За напълно непознати структури съществува начинът mapReduce за правене на нещата:

db.c.mapReduce(
    function () {
        this["array_to_sort"].sort(function(a,b) {
            return a.a - b.a || a.b - b.b;
        });

        emit( this._id, this );
    },
    function(){},
    { "out": { "inline": 1 } }
)

Разбира се, това има изходен формат, който е специфичен за mapReduce и следователно не е точно документът, който сте имали, но всички полета се съдържат под „стойности“:

{
    "results" : [
            {
                    "_id" : 0,
                    "value" : {
                            "_id" : 0,
                            "some_field" : "a",
                            "array_to_sort" : [
                                    {
                                            "a" : 1,
                                            "b" : 0
                                    },
                                    {
                                            "a" : 3,
                                            "b" : 3
                                    },
                                    {
                                            "a" : 3,
                                            "b" : 4
                                    }
                            ]
                    }
            }
    ],
}

Бъдещите издания ( към момента на писане ) ви позволяват да използвате $$ROOT променлива в агрегат за представяне на документа:

db.c.aggregate([
    { "$project": {
        "_id": "$$ROOT",
        "array_to_sort": "$array_to_sort"
    }},
    { "$unwind": "$array_to_sort"},
    { "$sort": {"array_to_sort.b":1, "array_to_sort:a": 1}},
    { "$group": { 
        "_id": "$_id",
        "array_to_sort": { "$push":"$array_to_sort"}
    }}
]);

Така че няма смисъл да използвате последния етап "проект", тъй като всъщност не знаете другите полета в документа. Но всички те ще се съдържат (включително оригиналния масив и ред) в _id поле на документа с резултата.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongodb групиране и сортиране

  2. Неоправдано бавна MongoDB заявка, въпреки че заявката е проста и съобразена с индекси

  3. Маскиране на PII в MongoDB, Cassandra и Elasticsearch с DarkShield:…

  4. Как да се подигравам на mongodb за единични тестове на python?

  5. получаване на InvalidOperationException при заявка с AsQueryable в C#