我的数据格式如下:
{
"Array1" : [
"A",
"B",
"C",
"D",
"E"
],
"tag": "X"
}
{
"Array1" : [
"A",
"B",
"C",
"X",
"Y"
],
"tag": "X"
}
{
"Array1" : [
"A",
"B",
"C",
"L",
"M"
],
"tag": "U"
}
并且,我需要在aggregate命令期间对Array1执行pop命令,以便忽略最后一个元素。我正在尝试以下命令:
aggregate([
{$unwind: "$Array1"},
{$group: {_id: "$Array1" count: {$sum: 1}}},
])
同样,是否可以忽略数组的第一个元素?
编辑:预期输出:
{
"A": 3,
"B": 3,
"C": 3,
"D": 1,
"X": 1,
"L": 1
}
答案 0 :(得分:1)
我要跳过PHP翻译,因为它对我来说都是深夜,而且非常简单。但基本过程是这样的:
db.collection.aggregate([
{ "$unwind": "$Array1" },
{ "$group": {
"_id": "$_id",
"Array1": { "$push": "$Array1" },
"last": { "$last": "$Array1" }
}},
{ "$project": {
"Array1": {
"$setDifference": [
"$Array1",
{ "$map": { "input": ["A"], "as": "el", "in": "$last" } }
]
}
}}
])
如果您的数组项目实际上并不唯一,或者订单很重要,那么“set”运算符就会出现这种情况,那么请执行此操作:
db.collection.aggregate([
{ "$unwind": "$Array1" },
{ "$group": {
"_id": "$_id",
"Array1": { "$push": "$Array1" },
"last": { "$last": "$Array1" }
}},
{ "$unwind": "$Array1" },
{ "$redact": {
"$cond": {
"if": { "$eq": [ "$Array1", "$last" ] },
"then": "$$PRUNE",
"else": "$$KEEP"
}
}},
{ "$group": {
"_id": "$_id",
"Array1": { "$push": "$Array1" }
}}
])
在任何一种情况下,您基本上都是将数组中找到的$last
元素与整个数组进行比较,然后从选择中删除它。
但就个人而言,除非您需要此类操作进行进一步聚合,否则请在客户端代码中执行此操作。或者等待MongoDB的下一个版本,其中新的$slice
运算符使这一点变得简单:
db.collection.aggregate([
{ "$project": {
"Array1": {
"$slice": [
"$Array1",
0,
{ "$subtract": [
{ "$size": "$Array1" },
1
]}
]
}
}}
])
所有产品(以不同的形式,与“设定”操作一样):
{
"_id" : ObjectId("55cb4ef04f67f8a950c7b8fa"),
"Array1" : [
"A",
"B",
"C",
"D"
]
}
{
"_id" : ObjectId("55cb4ef04f67f8a950c7b8fb"),
"Array1" : [
"A",
"B",
"C",
"X"
]
}
{
"_id" : ObjectId("55cb4ef04f67f8a950c7b8fc"),
"Array1" : [
"A",
"B",
"C",
"L"
]
}