2

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

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

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

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

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

4

2 回答 2

2

我还在用 做我的第一步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" }
于 2013-03-05T09:34:03.683 回答
1

我不确定您的应用程序如何向数组添加元素,但一种选择是仅在有人实际工作时才使用$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}}])

这将使用userId 和工作天数从数组的每个元素创建单独的文档,然后$unwind只使用那些在星期一工作的人。请注意点符号以进入嵌入式文档。聚合框架还允许您重新定义字段,例如. 此查询的示例结果是:$group$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,然后匹配文档。您可以继续 -查看文档以获取更多详细信息

于 2013-03-05T09:34:38.800 回答