gpt4 book ai didi

mongodb - 如何根据从 objectId 中提取的创建日期对 MongoDB 集合进行分组?

转载 作者:可可西里 更新时间:2023-11-01 09:49:04 25 4
gpt4 key购买 nike

我想在 mongoDB 中使用组聚合,以便根据文档的创建日期对文档进行分组。我没有将创建日期保存为一个字段,但我知道我可以从我的 ObjectId 中提取这个日期。所以,我试着写这样的东西:

db.sales.aggregate(
[
{
$group : {
_id : { month: {$month: ObjectId("$_id").getTimestamp()},
day: {$dayOfMonth: ObjectId("$_id").getTimestamp()},
year: {$year: ObjectId("$_id").getTimestamp()}
},
averageQuantity: { $avg: "$quantity" },
count: { $sum: 1 }
}
}
]
)

我得到这个错误: 错误:无效的对象 ID:长度: @(shell):5:37

当我写一个特殊的 ObjectId 而不是“$_id”时,它就起作用了。例如: ObjectId("507c7f79bcf86cd7994f6c0e").getTimestamp()

它也有效,当我有一个日期字段来存储我的创建日期并写下这样的内容时:

db.sales.aggregate(
[
{
$group : {
_id : { month: {$month: "$date"},
day: {$dayOfMonth: "$date"},
year: {$year: "$date"}
},
averageQuantity: { $avg: "$quantity" },
count: { $sum: 1 }
}
}
]
)

但我想知道,如何直接使用我的 ObjectId 并获取时间戳来完成。

group by aggregation 及其相关数据可以在这个链接中找到: https://docs.mongodb.com/manual/reference/operator/aggregation/group/

但是我用我的自动 mongoDB 生成的 id 替换了这个例子中的简单整数 id 。

最佳答案

getTimestamp() 是一个函数,它应该在 javascript 函数中使用。

您需要在查询中更正两件事。一种是检索 Id,另一种是使用 getTimestamp() 函数。

Retrieval of Id

_id : { month: {$month: ObjectId("$_id").getTimestamp()}, 
day: {$dayOfMonth: ObjectId("$_id").getTimestamp()},
year: {$year: ObjectId("$_id").getTimestamp()}
}

获取带月、日、年的id的正确方法

_id : { month: "$_id.month",  day: "$_id.day", year: "$_id.year"},

原因:

month 是文档 id 的一部分,因此必须以这种方式检索它。日期和年份也类似。

Getting the Timestamp

将结果放入 javascript 循环并使用 getTimestamp() 方法。

db.sales.aggregate(
[
{
$group : {
_id : { month: "$_id.month", day: "$_id.day", year: "$_id.year"},
averageQuantity: { $avg: "$quantity" },
count: { $sum: 1 }
}
}
]
).forEach(function (doc)
{
doc["doc._id.month"]=doc._id.month.getTimestamp();
doc["doc._id.day"]=doc._id.day.getTimestamp();
doc["doc._id.year"]=doc._id.year.getTimestamp();
printjson(doc);
});

如果你有这样的收藏

{
"_id" : {
"month" : ObjectId("57bd7d3c0da65e3f92328e50"),
"day" : ObjectId("57bd7d3c0da65e3f92328e51"),
"year" : ObjectId("57bd7d3c0da65e3f92328e52")
},
"quantity" : 200
}

用javascript函数执行聚合查询后的结果如下

{
"_id" : {
"month" : ObjectId("57bd7d3c0da65e3f92328e50"),
"day" : ObjectId("57bd7d3c0da65e3f92328e51"),
"year" : ObjectId("57bd7d3c0da65e3f92328e52")
},
"averageQuantity" : 200,
"count" : 1,
"doc._id.month" : ISODate("2016-08-24T10:55:56Z"),
"doc._id.day" : ISODate("2016-08-24T10:55:56Z"),
"doc._id.year" : ISODate("2016-08-24T10:55:56Z")
}

关于mongodb - 如何根据从 objectId 中提取的创建日期对 MongoDB 集合进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39117957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com