过滤出空元素文档

问题描述 投票:0回答:3

我们有如下商店集合。我们需要将没有批处理的所有UNIQUE 'shop'返回为空([])。

由于这是聚合的一个阶段-无法使用索引。因此,我们需要找到最有效的方法来完成上述操作。

{
    "_id": ObjectId("xxxxxx"),
    "shop": "Q4",
    "batch": ["5647"],
},
{
    "_id": ObjectId("xxxxxx"),
    "shop": "Q4",
    "batch": ["2314", "0121"],
},
{
    "_id": ObjectId("xxxxxx"),
    "shop": "Q1",
    "batch": ["5647"],
},
{
    "_id": ObjectId("xxxxxx"),
    "shop": "Q1",
    "batch": [],
}

预期结果:问题4

mongodb aggregation-framework mongodb4.0
3个回答
0
投票

尝试一下:

db.shop.aggregate([{
    $group: {
        _id: '', shop: { $addToSet: '$shop' },
        emptyBatchShops: { $push: { $cond: [{ $eq: ['$batch', []] }, '$shop', null] } }
    }
}, { $project: { _id :0, uniques: { $setDifference: ["$shop", "$emptyBatchShops"] } } }])

收集数据:

/* 1 */
{
    "_id" : ObjectId("5e33c4daa855df1587760621"),
    "shop" : "Q4",
    "batch" : [ 
        "5647"
    ]
}

/* 2 */
{
    "_id" : ObjectId("5e33c4daa855df1587760622"),
    "shop" : "Q4",
    "batch" : [ 
        "2314", 
        "0121"
    ]
}

/* 3 */
{
    "_id" : ObjectId("5e33c4daa855df1587760623"),
    "shop" : "Q1",
    "batch" : [ 
        "5647"
    ]
}

/* 4 */
{
    "_id" : ObjectId("5e33c4daa855df1587760624"),
    "shop" : "Q1",
    "batch" : []
}

/* 5 */
{
    "_id" : ObjectId("5e33c8fca855df1587760625"),
    "shop" : "Q5",
    "batch" : [ 
        "5647"
    ]
}

/* 6 */
{
    "_id" : ObjectId("5e33c8fca855df1587760626"),
    "shop" : "Q5",
    "batch" : [ 
        "5647"
    ]
}

/* 7 */
{
    "_id" : ObjectId("5e33c907a855df1587760627"),
    "shop" : "Q6",
    "batch" : []
}

/* 8 */
{
    "_id" : ObjectId("5e33c907a855df1587760628"),
    "shop" : "Q6",
    "batch" : [ 
        "5647"
    ]
}

/* 9 */
{
    "_id" : ObjectId("5e33c90ea855df1587760629"),
    "shop" : "Q7",
    "batch" : []
}

/* 10 */
{
    "_id" : ObjectId("5e33c90ea855df158776062a"),
    "shop" : "Q8",
    "batch" : [ 
        "5647"
    ]
}

结果:

{
    "uniques" : [ 
        "Q5", 
        "Q4", 
        "Q8"
    ]
}

0
投票

这里是汇总查询,

输入

{
    "_id" : ObjectId("5e33c96b08591b1809677543"),
    "shop" : "Q5",
    "batch" : [
        "5857",
        "5837"
    ]
},

{
    "_id" : ObjectId("5e33c95a08591b1809677542"),
    "shop" : "Q5",
    "batch" : [
        "5657"
    ]
},

{
    "_id" : ObjectId("5e33c93008591b1809677540"),
    "shop" : "Q1",
    "batch" : [
        "5648",
        "5628"
    ]
},

{
    "_id" : ObjectId("5e33c2fe08591b180967753f"),
    "shop" : "Q1",
    "batch" : [ ]
},

{
    "_id" : ObjectId("5e33c2fe08591b180967753e"),
    "shop" : "Q1",
    "batch" : [
        "5647"
    ]
},

{
    "_id" : ObjectId("5e33c2fe08591b180967753d"),
    "shop" : "Q4",
    "batch" : [
        "2314",
        "0121"
    ]
},

{
    "_id" : ObjectId("5e33c2fe08591b180967753c"),
    "shop" : "Q4",
    "batch" : [
        "5647"
    ]
}

查询:

const query = [
    {
        $group: {
            _id: "$shop",
            batch: { $push: "$batch" }
        }
    },
    {
        $match: {
            'batch': { $ne: [] }
        }
    },
    {
        $project: {
            _id: 1
        }
    }

];

db.trades.aggregate(query)

结果

{
    "_id" : "Q5"
},     
{
    "_id" : "Q4"
}

0
投票

我尝试了这种聚合:

db.shops.aggregate( [
  { 
      $group: { 
          _id: "$shop", 
          hasEmptyBatches: { $addToSet: { $cond: [ {$eq: [ { $size: "$batch" }, 0 ] }, true, false ] } } 
      } 
  },
  { 
      $match: { hasEmptyBatches: { $ne: true } } 
  }
] )
© www.soinside.com 2019 - 2024. All rights reserved.