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

Pusta tablica uniemożliwia pojawienie się dokumentu w zapytaniu

Możesz użyć $cond operator w $project etap zastępowania pustego attr tablica z taką, która zawiera symbol zastępczy, taki jak null który może być użyty jako znacznik wskazujący, że ten dokument nie zawiera żadnego attr elementy.

Więc wstawisz dodatkowy $project taki etap tuż przed $unwind :

    {
        $project: {
            attrs: {$cond: {
               if: {$eq: ['$attrs', [] ]},
               then: [null],
               else: '$attrs'
           }}
        }
    },

Jedynym zastrzeżeniem jest to, że otrzymasz null wartość w końcowym attrs tablica dla tych grup, które zawierają co najmniej jeden dokument bez żadnych attrs elementy, więc musisz zignorować te po stronie klienta.

Przykład

W przykładzie użyto zmienionego $match etapie, ponieważ ten w twoim przykładzie jest nieprawidłowy.

Dokumenty wejściowe

[
  {_id: {type: 1, id: 2}, attrs: []},
  {_id: {type: 2, id: 1}, attrs: []},
  {_id: {type: 2, id: 2}, attrs: [{name: 'john', type: 22}, {name: 'bob', type: 44}]}
]

Wyjście

{
    "result" : [ 
        {
            "_id" : 1,
            "attrs" : [ 
                null
            ]
        }, 
        {
            "_id" : 2,
            "attrs" : [ 
                {
                    "name" : "bob",
                    "type" : 44
                }, 
                {
                    "name" : "john",
                    "type" : 22
                }, 
                null
            ]
        }
    ],
    "ok" : 1
}

Polecenie agregacji

db.test.aggregate([
    {
        $match: {
            '_id.servicePath': {
                $in: [
                    null
                ]
            }
        }
    },
    {
        $project: {
            _id: 1,
            "attrs.name": 1,
            "attrs.type": 1
        }
    },
    {
        $project: {
            attrs: {$cond: {
               if: {$eq: ['$attrs', [] ]},
               then: [null],
               else: '$attrs'
           }}
        }
    },
    {
        $unwind: "$attrs"
    },
    {
        $group: {
            _id: "$_id.type",
            attrs: {
                $addToSet: "$attrs"
            }
        }
    },
    {
        $sort: {
            _id: 1
        }
    }
])


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Unikalne identyfikatory z mongodb

  2. Usuwanie duplikatów rekordów za pomocą MapReduce

  3. Połączenie Mongo zamknięte w aplikacji keystonejs

  4. Mongoid te same typy dokumentów osadzonych dla różnych pól

  5. Wydaje się, że wyniki MapReduce są ograniczone do 100?