sql >> Databáze >  >> NoSQL >> MongoDB

seřadit pole v dotazu a promítnout všechna pole

Protože seskupujete na dokumentu _id můžete jednoduše umístit pole, která chcete zachovat, do seskupení _id . Poté můžete formulář znovu vytvořit pomocí $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"
    }}
]);

Dalším „trikem“ je použití dočasného názvu pole ve fázi seskupování. Je tomu tak, když $project a změňte název, získáte pole v pořadí uvedeném v příkazu projekce. Pokud byste tak neučinili, pole „array_to_sort“ by nebylo posledním polem v objednávce, protože je zkopírováno z předchozí fáze.

To je zamýšlená optimalizace v $project , ale pokud chcete objednávku, můžete to udělat tak, jak je uvedeno výše.

Pro zcela neznámé struktury existuje způsob, jak věci dělat 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 } }
)

To má samozřejmě výstupní formát, který je specifický pro mapReduce, a tedy ne přesně ten dokument, který jste měli, ale všechna pole jsou obsažena pod "hodnotami":

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

Budoucí vydání (v době psaní) vám umožní používat $$ROOT proměnná v agregaci reprezentující dokument:

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"}
    }}
]);

Nemá tedy smysl používat závěrečnou fázi „projektu“, protože ve skutečnosti neznáte ostatní pole v dokumentu. Ale všechny budou obsaženy (včetně původního pole a pořadí) v _id pole výsledného dokumentu.




  1. Jak zajistit, aby vaše MongoDB clustery přežily výpadky Amazon AWS?

  2. mongodb najít pomocí více položek pole

  3. Automatické doplňování s java, Redis, Elastic Search, Mongo

  4. make selže při pokusu o instalaci ovladače mongo php na Centos 6