MongoDB:如何检查所有数组条目在整个集合中是否唯一?

时间:2017-07-30 21:06:31

标签: mongodb aggregation-framework

mongo用户的小脑筋急转弯。

我有一些文件,如

{
    "_id" : ObjectId("19628f4f0545a733185b672f"),
    "name" : "hello",
    "items" : [ 
        {
            "itemNumber" : 12512,
            "value" : "let"
        }, 
        {
            "itemNumber" : 2546,
            "value" : "put"
        }
    ]
}

我需要确保每个项目itemNumber在整个系列中都是唯一的。

在SQL数据库中,我会有一个单独的项目表和检查数字是否唯一的查询将类似

select count(1) 
from (
   select itemNumber, count(itemNumber) as cnt 
   from items 
   group by itemNumber) sel 
where cnt>1;

结果0意味着所有itemNumber都是唯一的。 (可能有更好的方法在SQL中进行检查)

使用MongoDB,我能找到的唯一解决方案是

a)使用forEach将所有项目提取到单独的集合

b)进行简单的聚合

db.items.aggregate(
    { $group : { _id : '$itemNumber', count : {$sum : 1} } },
    { $out : "cnt" }
)

c)db.cnt.find({count: {$gt: 1}}).count()

有任何一种查询方式吗?

表现通知:该集合约为3M文件,每份2,2KB。我注意到包含$group的聚合在此集合中永远运行。

1 个答案:

答案 0 :(得分:1)

这样的事情怎么样:

db.items.aggregate(
    { $unwind: "$items" }    ,
    { $group : { _id : '$items.itemNumber', count : { $sum : 1 } } },
    { $match: { "count": { $gt: 1 } } }
)