MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Mảng trống ngăn tài liệu xuất hiện trong truy vấn

Bạn có thể sử dụng $cond toán tử trong $project giai đoạn để thay thế attr trống mảng với một mảng có chứa trình giữ chỗ như null có thể được sử dụng làm điểm đánh dấu để cho biết rằng tài liệu này không chứa bất kỳ attr nào các phần tử.

Vì vậy, bạn sẽ chèn thêm một $project giai đoạn như thế này ngay trước $unwind :

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

Cảnh báo duy nhất là bạn sẽ kết thúc bằng null giá trị trong attrs cuối cùng mảng cho những nhóm chứa ít nhất một tài liệu mà không có bất kỳ attrs , vì vậy bạn cần bỏ qua những yếu tố phía máy khách đó.

Ví dụ

Ví dụ sử dụng $match đã thay đổi vì cái trong ví dụ của bạn không hợp lệ.

Tài liệu đầu vào

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

Đầu ra

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

Lệnh tổng hợp

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. Nodejs Mongodb cập nhật nhiều bộ sưu tập

  2. Hợp nhất tài liệu với các mảng lồng nhau của nó và các mảng lồng nhau của chúng

  3. Chọn tài liệu trong đó tất cả các giá trị trong một trường mảng tồn tại trong một mảng khác

  4. Dự án mảng các đối tượng thành giá trị chính

  5. Gửi dữ liệu từ NodeJS trở lại cùng một trang html sau khi gửi biểu mẫu