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

cách hiển thị 0 cho tuần khi không có bản ghi nào phù hợp với tuần đó trong truy vấn mongodb $ tuần

Như $ tuần có thể trả về giá trị giữa 053 Tôi cho rằng bạn mong đợi 54 kết quả là tài liệu có 0 hoặc các giá trị khác 0 cho documentCount . Để đạt được điều đó, bạn nên tập hợp tất cả tài liệu của mình thành một ( $ nhóm -ing bởi null ) và sau đó tạo đầu ra.

Để tạo một dải số, bạn có thể sử dụng $ range toán tử và sau đó bạn có thể tạo đầu ra bằng cách sử dụng $ map . Để chuyển một mảng tài liệu thành nhiều tài liệu, bạn có thể sử dụng $ thư giãn .

db.collectionName.aggregate([
    //where query
    { "$match": {  $and:[{CreatedOn:{$lte:ISODate("2018-07-14T13:59:08.266+05:30")}},{CreatedOn:{$gte:ISODate("2018-06-10T13:59:08.266+05:30")}}] } },
    //distinct column 
    {
        "$group": {
            _id: {$week: '$CreatedOn'},
            documentCount: {$sum: 1}
        }
    },
    {
        $group: {
            _id: null,
            docs: { $push: "$$ROOT" }
        }
    },
    {
        $project: {
            docs: {
                $map: {
                    input: { $range: [ {$week:ISODate("2018-06-10T13:59:08.266+05:30")}, {$week:ISODate("2018-07-14T13:59:08.266+05:30")}]},
                    as: "weekNumber",
                    in: {
                        $let: {
                            vars: { index: { $indexOfArray: [ "$docs._id", "$$weekNumber" ] } },
                            in: {
                                $cond: {
                                    if: { $eq: [ "$$index", -1 ] },
                                    then: { _id: "$$weekNumber", documentCount: 0 },
                                    else: { $arrayElemAt: [ "$docs", "$$index" ] }
                                }
                            }
                        }
                    }
                }
            }
        }
    },
    {
        $unwind: "$docs"
    },
    {
        $replaceRoot: {
            newRoot: "$docs"
        }
    }
])

Sử dụng $ indexOfArray để kiểm tra xem mảng tài liệu hiện tại có chứa tài liệu (-1 không) và $ arrayElemAt để lấy tài liệu hiện có từ docs . Bước cuối cùng ( $ ReplaceRoot ) chỉ để loại bỏ một cấp độ lồng nhau (docs ). Kết quả đầu ra:

{ "_id" : 0, "documentCount" : 0 }
{ "_id" : 1, "documentCount" : 0 }
{ "_id" : 2, "documentCount" : 0 }
...
{ "_id" : 22, "documentCount" : 0 }
{ "_id" : 23, "documentCount" : 2 }
{ "_id" : 24, "documentCount" : 9 }
{ "_id" : 25, "documentCount" : 1 }
{ "_id" : 26, "documentCount" : 1 }
{ "_id" : 27, "documentCount" : 0 }
...
{ "_id" : 52, "documentCount" : 0 }
{ "_id" : 53, "documentCount" : 0 }

Bạn có thể dễ dàng tùy chỉnh kết quả trả về bằng cách sửa đổi đầu vào của $map sân khấu. Ví dụ:bạn có thể chuyển một mảng các khuyết điểm như input: [21, 22, 23, 24] nữa.

CHỈNH SỬA:Để lấy các tuần giữa các ngày được chỉ định, bạn có thể sử dụng $week cho ngày bắt đầu và ngày kết thúc để lấy số liệu.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Sự khác biệt giữa id và _id trong mongoose là gì?

  2. MongoDb c # trình điều khiển tìm mục trong mảng theo giá trị trường

  3. MongoDB - $ text operator tìm kiếm cho cụm từ HOẶC (các) từ

  4. cách hiển thị truy vấn trong khi sử dụng chú thích truy vấn với MongoRepository với dữ liệu mùa xuân

  5. Hết thời gian chờ kết nối với MongoDb trên Azure VM