我有一个这样的查询(简化):
db.collection.aggregate([
{ $match: { main_id: ObjectId("58f0f67f50c6af16709fd2c7") } },
{
$group: {
_id: "$name",
count: { $sum: 1 },
sum: { $sum: { $add: ["$P31", "$P32"] } }
}
}
])
我从Java中执行这个查询,我想将它Map到我的类上,但我不想将_id
Map到name
字段上。因为如果我这样做:
@JsonProperty("_id")
private String name;
然后,当我将此数据保存回mongo时(经过一些修改),数据以名称_id
保存,而我希望生成一个真实的ID。
那么,$group
操作后,如何重命名_id
呢?
7条答案
按热度按时间bz4sfanl1#
您可以通过在管道的末尾添加
$project
stage来实现这一点,如下所示:在线试用:mongoplayground.net/p/QpVyh-0I-bP
bqf10yzr2#
从mongo v3.4开始,你可以将
$addFields
与$project
结合使用,以避免在$project
中写入所有字段,这可能会非常繁琐。在
$project
中会发生这种情况,因为如果您特别包含一个字段,则其他字段将被自动排除。示例:
bfhwhh0e3#
osh3o9ms4#
从
Mongo 4.2
开始,您可以使用$set
/$unset
阶段的组合:$set
阶段将新字段添加到文档中,$unset
阶段从文档中删除/排除要重命名的字段。vlju58qv5#
如果你使用的是
find
方法,你不能这样做,但如果你使用的是aggregation
,它是非常容易的,就像这样:bbuxkriu6#
由于所有的答案都是在MongoDB查询中编写的解决方案,尽管问题在Java中寻求解决方案,但我使用Java的方法用于后期。
分组后,我们可以使用
Projections.computed("<expected field name>", "$_id")))
重命名_id
字段名将问题中提到的查询的核心部分转换为Java
为了具体地回答这个问题,我从上面的代码片段中摘录了一段代码,在这里我使用
Projections.computed("name", "$_id")
将_id
字段值重命名为name,它将分组后得到的_id
的值Map到名为name
的字段。此外,我们应该使用Projections.excludeId()
排除id。kyks70gy7#
以下是使用MongoTemplate的Java工作示例: