我使用$ project运算符从Date中提取周部分,然后在聚合管道中按周进行分组.
{ $project: {
year: { $year: [ "$datetime" ] },
week: { $week: [ "$datetime" ] },
....
}
},
....
{ $group: {
_id: {
year: "$year",
week: "$week",
},
.....
}
}
Run Code Online (Sandbox Code Playgroud)
但是我用它的$周运算符总是将星期日视为一周的第一天,我们使用星期一作为我们所在地的第一天.因此,按周分组的结果对我来说总是不正确的.有什么方法可以解决这个问题,或者已知的解决方法?
mongo跟踪系统中的现有请求似乎一年多没有解决(是否真的很少需要选项?)欢迎任何可能的选择.也许有可能在javascript中创建一些自定义函数并在某处添加/替换它?
我使用聚合框架对一些数据进行分组。据观察,当使用 $project pipeline stage 时,它会以某种方式阻止以下 $match 使用索引。我在字段“timestamp”上有一个索引,集合包含 500 000 条记录。
如果我使用以下命令和管道:
db.collection.runCommand('aggregate', {pipeline: [ { "$match" : { "timestamp" : { "$gt" : 1388425361294 , "$lt" : 1388443361294}}} ], explain: true})
Run Code Online (Sandbox Code Playgroud)
执行计划与预期基本一致,即扫描了 4 个文档。摘自“解释”:
"cursor" : {
"cursor" : "BtreeCursor timestamp_1",
"isMultiKey" : false,
"n" : 4,
"nscannedObjects" : 4,
"nscanned" : 4,
"nscannedObjectsAllPlans" : 4,
"nscannedAllPlans" : 4,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
"timestamp" : [ …Run Code Online (Sandbox Code Playgroud) mongodb ×2