如果我想在查询日期之后返回其他信息,如何设计mongodb结构?

时间:2018-03-28 03:52:31

标签: mongodb

在我的示例中,电影院有两部电影,我希望在查询{ $gte: ISODate("2018-03-27 19:00:00.000Z")}后,我可以通过Pacific Rim Uprising21:00和{{1}获得电影21:40Tomb Raider

这是我的文件:

19:30

我在寻找教程,他们所教的只是一个带日期的文档。查询日期并明显获取其他信息。

在我的情况下,我很困惑。

任何人都可以教我如何重组我的数据库或分享任何教程链接?任何帮助,将不胜感激。提前谢谢。

1 个答案:

答案 0 :(得分:1)

您可以按照以下方式重新构建您的收藏:每个影院都有一系列电影,每部电影都有一个名称,照片和发布时间。

{
    "_id" : ObjectId("5abb086677d96df7015c56c6"),
    "theater" : "Madou",
    "movies" : [{
        "name": "Pacific Rim Uprising",
        "photo": "https://movies.yahoo.com.tw/x/r/w420/i/o/production/movies/March2018/GD9otOLc6d3eprWHC1Ve-2757x4000.jpg",
        "releasedTimes" : [ 
            ISODate("2018-03-27T12:20:00.000Z"), 
            ISODate("2018-03-27T14:30:00.000Z"), 
            ISODate("2018-03-27T15:10:00.000Z"), 
            ISODate("2018-03-27T16:40:00.000Z"), 
            ISODate("2018-03-27T18:50:00.000Z"), 
            ISODate("2018-03-27T21:00:00.000Z"), 
            ISODate("2018-03-27T21:40:00.000Z")
        ]
    }, {
        "name": "Tomb Raider",
        "photo": "https://movies.yahoo.com.tw/x/r/w420/i/o/production/movies/March2018/MueV83b8cYC28yRbknIT-3254x4650.jpg",
        "releasedTimes" : [ 
            ISODate("2018-03-27T13:00:00.000Z"), 
            ISODate("2018-03-27T17:20:00.000Z"), 
            ISODate("2018-03-27T19:30:00.000Z")
        ]
    }]
}

在仅发布时间超过指定日期的电影方面,您需要使用aggregation - 特别是$filter$map的组合来过滤子数组。你可以阅读这个answer来大致了解为什么用这种方式编写(尽管可能有更简单的方法)。

db.theatres.aggregate([{
    $project: {
        theater: true,
        movies: { 
            $filter: {
                input: {
                    $map: { 
                        input: "$movies", 
                        as: "movie", 
                        in: { 
                            name: "$$movie.name", 
                            photo: "$$movie.photo", 
                            releasedTimes: { 
                                $filter: { 
                                    input: "$$movie.releasedTimes", 
                                    as: "time", 
                                    cond: { $gte: [ "$$time", ISODate("2018-03-27 19:00:00.000Z") ] }
                                }
                            }
                        }
                    }
                }, 
                as: "movie",  
                cond: "$$movie"
            }
        }
    }
}])

在Robo3T上测试后,结果将是

{
    "_id" : ObjectId("5abb086677d96df7015c56c6"),
    "theater" : "Madou",
    "movies" : [ 
        {
            "name" : "Pacific Rim Uprising",
            "photo" : "https://movies.yahoo.com.tw/x/r/w420/i/o/production/movies/March2018/GD9otOLc6d3eprWHC1Ve-2757x4000.jpg",
            "releasedTimes" : [ 
                ISODate("2018-03-27T21:00:00.000Z"), 
                ISODate("2018-03-27T21:40:00.000Z")
            ]
        }, 
        {
            "name" : "Tomb Raider",
            "photo" : "https://movies.yahoo.com.tw/x/r/w420/i/o/production/movies/March2018/MueV83b8cYC28yRbknIT-3254x4650.jpg",
            "releasedTimes" : [ 
                ISODate("2018-03-27T19:30:00.000Z")
            ]
        }
    ]
}

如果需要,您可能需要添加additional stages来过滤掉没有发布时间影片的影院。