MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

mongoDB:jak odwrócić $unwind

Istnieje szczególna sztuczka, jak to zrobić, ale po pierwsze, jeśli masz dostępną MongoDB w wersji 2.6 lub nowszej, możesz robić, co chcesz, bez użycia $unwind . Może to być bardzo przydatne w przypadku przetwarzania dużej liczby dokumentów.

Kluczowymi operatorami są tutaj $map który przetwarza tablice w miejscu i $allElementsTrue operator, który oceni twoje pola "wynikowe". Użycie tutaj "mapy" pozwala zarówno na testowanie wewnętrznej tablicy "testy", aby zobaczyć, gdzie wszystkie pola "wyniku" spełniają prawdziwy warunek. W przypadku tablicy zewnętrznej ten „wynik” można umieścić w tych dokumentach zgodnie z potrzebami, a pełna ocena dokumentu podlega tym samym zasadom:

db.test.aggregate([
    { "$project": {
        "name": 1,
        "result": {
            "$allElementsTrue": {
                "$map": {
                    "input": "$acts",
                    "as": "act",
                    "in": {
                        "$allElementsTrue": {
                            "$map": {
                                 "input": "$$act.tests",
                                 "as": "test",
                                 "in": "$$test.result"
                            }
                        }
                    }
                }
            }
        },
        "acts": {
            "$map": {
                 "input": "$acts",
                 "as": "act",
                 "in": {
                    "name": "$$act.name",
                    "result": {
                        "$allElementsTrue": {
                            "$map": {
                                "input": "$$act.tests",
                                "as": "test",
                                "in": "$$test.result"
                            }
                        }
                    },
                    "tests": "$$act.tests"
                 }
            }
        }
    }}
])

Sposób wykonania tego we wcześniejszych wersjach wymaga $grupa z powrotem w dwóch krokach, aby „odbudować” tablice podczas ponownego wykonywania testów na tych polach „wyniku”. Inną różnicą jest również użycie $min operator jako false będzie uważana za mniejszą wartość niż true i ocenia zgodnie z tą samą koncepcją „allElements”:

db.test.aggregate([
    { "$unwind": "$acts" },
    { "$unwind": "$acts.tests" },
    { "$group": {
        "_id": {
            "_id": "$_id",
            "name": "$name",
            "actName": "$acts.name"
        },
        "result": { "$min": "$acts.tests.result" },
        "tests": {
           "$push": {
               "name": "$acts.tests.name",
               "result": "$acts.tests.result"
           }
        }
    }},
    { "$group": {
        "_id": "$_id._id",
        "name": { "$first": "$_id.name" },
        "result": { "$min": "$result" },
        "acts": {
            "$push": {
                "name": "$_id.actName",
                "result": "$result",
                "tests": "$tests"
            }
        }
    }}
])



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Pobieraj z wielu oddzielnych kolekcji za pomocą Express i MongoDB

  2. Odmowa połączenia z MongoDB errno 111

  3. Użyj dodatku Heroku mongolab z node.js

  4. Otrzymuj powiadomienia o zmienionych dokumentach w mongodb

  5. Zagnieżdżona tablica agregatów Mongo