需要一个更好的模式来查询mongodb中的计划

时间:2013-03-05 09:28:39

标签: mongodb

我需要在mongodb中设计一个计划模式,原始数据格式是这样的 的 { “schedule_begin”:日期, “SCHEDULE_END”:日期, “schedule_days_runs”: “1111100”}

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

基本上,应用程序的作用是查找在特定日期(e.x星期一)工作的所有计划,这意味着我们需要查询计划, schedule_start =< one_day< = schedule_end ,同时确保查询的日程安排也在周一进行。

一个简单的解决方案是将“1111100”直接存储在String中的mongodb中,只使用schedule_start和schedule_end进行查询,然后使用应用程序逻辑来获取结​​果。然而,这个解决方案可能不方便,因为通常我会得到数千个查询,而一半的查询不是答案。例如,要获取特定日期的工作时间表'1111100'(时间表从星期一到星期五工作),查询结果会给我许多无用的东西,例如'0000011'(时间表在周末工作)。

我想找出一个更好的解决方案,有人有更好的想法吗?

2 个答案:

答案 0 :(得分: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" }

答案 1 :(得分: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}}])

这将使用$unwind使用$group$match使用userId和工作日创建单独的数组元素,然后"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 。此查询的示例结果是:

{{1}}

}

您可以使用聚合框架执行更多操作,并且查询的每个部分都会将信息传递给下一个。所以上面,$ unwind将信息传递给$ group,然后匹配文档。你可以继续前进 - check out the docs for more detailed info