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

Динамично лепкаво сортиране в Mongo за проста стойност или списък

Не мога да възпроизведа грешката ви, но имате няколко „печатни грешки“ във въпроса си, така че не мога да съм сигурен какво всъщност имате.

Но ако приемем, че всъщност работите с MongoDB 2.6 или по-нова версия, вероятно искате $setIntersection или $setIsSubset оператори вместо $setUnion . Тези оператори предполагат „съвпадение“ на съдържанието на масива, с който се сравняват, където $setUnion просто комбинира предоставения масив със съществуващия:

db.people.aggregate([
    { "$project": {
        "first_name": 1,
        "last_name": 1,
        "sticky": { 
            "$size": { 
                "$setIntersection": [ "$offices", [ "FL", "SC" ]] 
            }
        },
        "offices": 1
    }},
    { "$sort": {
        "sticky": -1,
        "last_name": 1
    }}
])

В предишни версии, където нямате тези оператори за задаване вие просто използвате $unwind за работа с масива и същия вид $cond операция както преди в рамките на $group за да съберем всичко обратно:

db.people.aggregate([
    { "$unwind": "$offices" },
    { "$group": {
        "_id": "$_id",
        "first_name": { "$first": "$first_name" },
        "last_name": { "$first": "$last_name",
        "sticky": { "$sum": { "$cond": [
            { "$or": [
                { "$eq": [ "$offices": "FL" ] },
                { "$eq": [ "$offices": "SC" ] },
            ]},
            1,
            0
        ]}},
        "offices": { "$push": "$offices" }
    }},
    { "$sort": {
        "sticky": -1,
        "last_name": 1
    }}
])

Но със сигурност бяхте на прав път. Просто изберете правилната операция за настройка или друг метод, за да получите точните си нужди.

Или тъй като сте публикували своя начин да получите това, което искате, по-добър начин да напишете този вид „подредено съвпадение“ е следният:

db.people.aggregate([
    { "$project": {
        "first_name": 1,
        "last_name": 1,
        "sticky": { "$cond": [
            { "$anyElementTrue": {
                "$map": {
                    "input": "$offices",
                    "as": "o",
                    "in": { "$eq": [ "$$o", "FL" ] }
                }
            }},
            2,
            { "$cond": [
                { "$anyElementTrue": {
                    "$map": {
                        "input": "$offices",
                        "as": "o",
                        "in": { "$eq": [ "$$o", "SC" ] }
                    }
                }},
                1,
                0
            ]}
        ]},
        "offices": 1
    }},
    { "$sort": {
        "sticky": -1,
        "last_name": 1
    }}
])

И това ще даде приоритет на документите с „офиси“, съдържащи „FL“ пред „SC“ и следователно пред всички останали, и извършване на операцията в рамките на едно поле. Това също трябва да е много лесно за хората да видят как да абстрахират това във формуляра с помощта на $unwind в по-ранни версии без операторите set. Където просто предоставяте по-високата стойност на „теглото“ на елементите, които искате в горната част, като влагате $cond изявления.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Можем ли да използваме пролетно хранилище за данни за актуализиране на вградени документи в mongodb

  2. Как да получите максималните и минималните дати в колекция от документи с помощта на пакета jenssegers/laravel-mongodb?

  3. свържете mongodb с djongo (Django)

  4. Актуализация на MongoDB:Генерирайте ново поле въз основа на съществуващо поле или актуализирайте на място

  5. Mongo ID води до страшни URL адреси