我需要在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'(时间表在周末工作)。
我想找出一个更好的解决方案,有人有更好的想法吗?
答案 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。