javascript - MongoDB填写查询结果中不包含的数据

标签 javascript mongodb

假设我有一个包含以下数据的集合:

{"date" : ISODate("2018-01-01T00:00:00Z"), "count" : 3 }
{"date" : ISODate("2018-01-04T00:00:00Z"), "count" : 5 }

我应该使用哪些 mongodb 函数才能生成导致以下结果的查询:

{"date" : ISODate("2018-01-01T00:00:00Z"), "count" : 3 }
{"date" : ISODate("2018-01-02T00:00:00Z"), "count" : 0 }
{"date" : ISODate("2018-01-03T00:00:00Z"), "count" : 0 }
{"date" : ISODate("2018-01-04T00:00:00Z"), "count" : 5 }
{"date" : ISODate("2018-01-05T00:00:00Z"), "count" : 0 }

基本上,我想迭代一个日期范围,如果给定的日期不在集合中,我将只输出一个 'count':0 。

我可以通过检索文档并使用 JavaScript 代码来填充结果中没有的数据来完成此操作,但我只是想知道是否可以仅使用 mongodb 查询来实现。

谢谢!

最佳答案

可以通过$range生成范围并进行自查找

步骤

  1. $group - 动态查找最小和最大日期,如果需要则进行硬编码
  2. $project - 根据最小值和最大值生成 $range,如果需要则进行硬编码
  3. $unwind - 将范围展开到文档
  4. $project - 通过生成的数字生成日期
  5. $lookup - 根据日期自加入集合
  6. $project - 如果找到匹配则返回计数,否则返回 0。如果 mongo 版本低于 3.6,则将 $ifNull 更改为 $cond

聚合管道

db.t.aggregate(
    [   
        {
            $group : { _id : null, startDate : { "$min" : "$date" }, endDate : { "$max" : "$date" }} 
        },
        {
            $project : { _id : 0 , startDate : 1,  genNo : { $range : [ { $add : [ {"$dayOfMonth" : "$startDate"}, -1 ] }, { $add : [ {"$dayOfMonth" : "$endDate"} , 1 ] } ] } }
        },
        {
            $unwind : "$genNo"
        },
        {
            $project : { genDate : { $add : [ "$startDate", { $multiply : [ "$genNo" , 86400000 ] } ] } }
        },
        {
            $lookup : {
                from : "t",
                localField : "genDate",
                foreignField : "date",
                as : "out"
            }
        },
        {
            $project : { date : "$genDate", count : { $ifNull : [ { $arrayElemAt : ["$out.count", 0 ] }, 0 ] } }
        }
    ]
)

收藏

> db.t.find()
{ "_id" : ObjectId("5a5d78d5423b9839ce07bd77"), "date" : ISODate("2018-01-01T00:00:00Z"), "count" : 3 }
{ "_id" : ObjectId("5a5d78d5423b9839ce07bd78"), "date" : ISODate("2018-01-04T00:00:00Z"), "count" : 5 }
> 

聚合结果

{ "date" : ISODate("2018-01-01T00:00:00Z"), "count" : 3 }
{ "date" : ISODate("2018-01-02T00:00:00Z"), "count" : 0 }
{ "date" : ISODate("2018-01-03T00:00:00Z"), "count" : 0 }
{ "date" : ISODate("2018-01-04T00:00:00Z"), "count" : 5 }
{ "date" : ISODate("2018-01-05T00:00:00Z"), "count" : 0 }
> 

关于javascript - MongoDB填写查询结果中不包含的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48273693/

相关文章:

mongodb - 我如何在 mgo Mongodb 中选择所有相同类型的嵌入式文档?

javascript - 自引用类

javascript - 验证 javascript 中的有效 html 标签

node.js - Mongoose:FindOneAndUpdate(),带有来自字段引用的查询

java - 使用 Spring 登录 Mongodb

php - PHP中mongodb聚合中的Substr

javascript - ExtJS 4,自定义Ext.grid.Panel的boolean列值

javascript - Chrome : Uncaught Error: can't load XRegExp twice in the same frame

javascript - Facebook Canvas : Uncaught TypeError: Cannot call method 'sort' of undefined

javascript - 使用 Node.js Express 将 MongoDB 数据传递到 .ejs-Template