【问题标题】:need a better schema to query the schedule in mongodb需要更好的模式来查询 mongodb 中的计划
【发布时间】:2013-02-19 15:22:31
【问题描述】:

我需要在mongodb中设计一个schedule schema,原来的数据格式是这样的 {"schedule_begin":Date,"schedule_end":Date,"schedule_days_runs":"1111100"}

请注意,架构中有一个属性 schedule_days_runs,其数据为 "schedule_days_runs":"1111100"。一周有 7 天,其中“1”代表工作,“0”代表不工作。

基本上,应用程序所做的是查找在某个日期(例如星期一)工作的所有时间表,这意味着我们需要查询时间表,schedule_start =,还要确保查询的时间表也在星期一工作。

一个简单的解决方案是直接将“1111100”以String的形式存储到mongodb中,只使用schedule_start和schedule_end进行查询,然后使用应用逻辑获取结果。然而,这个解决方案可能并不方便,因为通常我会收到数千个查询,而一半的查询不是答案。例如,要获取特定日期 '1111100' 的工作计划(计划从周一到周五工作),查询的结果会给我很多无用的信息,例如 '0000011'(计划在周末工作)。

我正在尝试找出更好的解决方案,有人有更好的主意吗?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    我仍在使用mongodb 进行我的第一步,但我认为使用具有不同值的数组更适合mongodb。大致如下:

    { 
      "schedule_begin": Date,
      "schedule_end":Date,
      "schedule_days_runs": ["mo", "tu", "we", "th", "fr", "sa", "su"]
    }
    

    然后你可以使用如下查询:

    { schedule_days_runs: "mo" }
    

    让所有的事情都在星期一运行。

    据我所知,其中可能有一些拼写错误。此外,据我所见,使用 mongodb,我们必须摆脱使用关系数据库所学到的几乎所有东西,这是另一回事。使用全新的方法让我解决了一些使用关系方法难以解决的问题。

    我用这个问题作为参考:Querying array elements with Mongo

    要找出数组的长度,这个问题很有用:In Mongo DB, how do I find documents where array size is greater than 1

    引用:

    使用 $where

    db.accommodations.find( { $where: "this.name.length > 1" } );
    

    所以基于此,你应该尝试:

    { $where : "this.schedule_days_runs.length > 1" }
    

    【讨论】:

    • 所以现在我使用“schedule_days_runs”:[1,2,3,4,5,6,7],但是如何查询数组大小大于1的文档?我试过这个,{"schedule_start_date": {"$lte": today},"schedule_end_date":{"$gte":today}, {"$where": {this.schedule_days_runs.length:{"$gt" :0}}} },但它给了我一个错误。出现在代码 {"$where": {this.schedule_days_runs.length:{"$gt":0}}} 上,我该怎么办?
    • @user824624 我更新了答案,今天早些时候我找到了这个问题的答案:{$where: "this.schedule_days_runs.length > 1" }
    • 我试过这个 "$where": {"this.schedule_days_runs.length" > 1},它给了我一个 SyntaxError: Unexpected token > 的错误
    • 确保将双引号放在 1 之后,与 @ppeterka 显示的 {$where: "this.schedule_days_runs.length > 1" } 完全相同
    • 我仍然认为聚合框架对你来说是一个不错的选择,所以我在下面扩展了我的答案
    【解决方案2】:

    我不确定您的应用程序如何将元素添加到数组中,但一种选择是仅在有人实际工作时使用$push$addToSet 将天数添加到数组中。然后,您可以检查数组的长度,以了解每个人工作了多少天。

    您还可以使用聚合框架(我认为这是更好的选择)来运行查询并生成报告。例如,使用以下文档结构:

    { 
      "userId":"user ID"
      "schedule_begin": "Date",
      "schedule_end": "Date",
      "schedule_days_runs": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
    }
    

    您可以运行以下查询来找出谁在星期一工作。

    db.schedule.aggregate([{$unwind:"$schedule_days_runs"},{$group:{"_id":{"working_days":"$schedule_days_runs", "name":"$userId"}}},{$match:{"_id.working_days":"Monday"}},{$sort:{"_id.name":1}}])
    

    这将使用 $unwind$group 从数组的每个元素创建单独的文档,它们按 userId 和工作天数,然后 $match 仅与那些在星期一工作的人一起创建。请注意点符号以进入嵌入式文档。聚合框架还允许您重新定义字段,例如"name":"$userId"。此查询的示例结果是:

    {
        "result" : [
                {
                        "_id" : {
                                "working_days" : "Monday",
                                "name" : "Charlie Sheen"
                        }
                },
                {
                        "_id" : {
                                "working_days" : "Monday",
                                "name" : "Donald Duck"
                        }
                },
                {
                        "_id" : {
                                "working_days" : "Monday",
                                "name" : "Superman"
                        }
                }
        ],
        "ok" : 1
    

    }

    您可以使用聚合框架做更多事情,并且查询的每个部分都将信息传递到下一个部分。因此,在上面,$unwind 将信息通过管道传递给 $group,然后匹配文档。你可以继续 - check out the docs for more detailed info

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      • 1970-01-01
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多