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

Празният масив не позволява документът да се появи в заявката

Можете да използвате $cond оператор в $project етап за замяна на празния attr масив с такъв, който съдържа контейнер като null който може да се използва като маркер, за да покаже, че този документ не съдържа attr елементи.

Така че бихте вмъкнали допълнителен $project етап като този точно преди $unwind :

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

Единственото предупреждение е, че в крайна сметка ще получите null стойност в крайния attrs масив за тези групи, които съдържат поне един документ без никакви attrs елементи, така че трябва да игнорирате тези от страна на клиента.

Пример

Примерът използва променен $match етап, защото този във вашия пример не е валиден.

Въвеждане на документи

[
  {_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}]}
]

Изход

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

Агрегирана команда

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. Изтегляне на MongoDB Java

  2. Композитен ключ на MongoDB:InvalidOperationException:{document}. Самоличността не се поддържа

  3. как да актуализирате обект от mLab колекция с помощта на _id

  4. $unset е празен. Трябва да посочите поле така:{$unset:{<field>:...}}

  5. В Mongo има ли начин да се направи проверка и настройка като атомна операция?