我在MongoDB中有这个数据。
{ _id: "abc*hello*today*123", "value": 123 },
{ _id: "abc*hello*today*999", "value": 999 },
{ _id: "xyz*hello*tomorrow*123", "value": 123 }
我想要的是按“*{number}"之前的第一部分分组。这就是我想要实现的:
{
_id: "abc*hello*today",
results: [
{ _id: "abc*hello*today*123", "value": 123 },
{ _id: "abc*hello*today*999", "value": 999 }
]
},
{
_id: "xyz*hello*tomorrow",
results: [
{ _id: "xyz*hello*tomorrow*123", "value": 123 }
]
}
我试过这个:
{
$group:{
"_id":"$_id".slice(0, -4)
}
}
2条答案
按热度按时间tag5nh1u1#
您可以使用regex,如下所示:
上面的正则表达式将匹配并检索 * 和数字之前的值。
Demo @ Regex 101
$set
-设置firstPart
字段。1.1.
$getField
-从对象 1.1.1 取得match
值。1.1.1.
$regexFind
-将_id
与正则表达式匹配。$group
-按firstPart
分组。$unset
-移除results.firstPart
字段。Demo @ Mongo Playground
qjp7pelc2#
**替代解决方案:**如果您的
_id
始终具有相同的(field1*field2*field3*numbers)
,则可以使用$split
+$slice
+$reduce
运算符解释:
第一个
MongoPlayground