如何使用Aggregate pop()数组的最后一个元素

时间:2015-08-12 13:19:58

标签: mongodb mongodb-query aggregation-framework

我的数据格式如下:

{ 
    "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
}

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"
        ]
}