您在这里所指的函数是一个 JavaScript 方法,它作为 ObjectId 包装器的 shell 助手实现。其他各种语言的驱动程序实现包含一个类似的方法,其基本功能可以从 mongo shell 中看到:
function (){
return new Date(parseInt(this.valueOf().slice(0,8), 16)*1000);
}
但这至少在 shell 上下文中是 JavaScript,你不能在聚合框架中使用 JavaScript 方法,只允许实现的运算符。目前在聚合框架方法中没有从 ObjectId 中提取“时间戳”的“助手”。
同样,聚合框架目前缺少如上示例中所示的实现此功能所需的功能。您不可能将 ObjectId “转换”为字符串,更不用说将字符串转换为整数或从基本类型转换。
对于聚合框架,最好的设计方法是在文档中包含所需的日期值并进行相应更新。
如果您真的不想这样做并且必须从 ObjectId 值中提取日期,那么您需要使用带有 mapReduce 的 JavaScript 评估,或者转移到客户端代码:
db.collection.mapReduce(
function() {
// Get time group per day
var id = this._id.getTimestamp()
- ( this._id.getTimestamp() % ( 1000 * 60 * 60 * 24 ) );
delete this._id;
emit( id, this );
},
function(key,values) {
// some reduce operation
},
{ "out": { "inline": 1 } }
)