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

MongoDB:如何检查所有数组项在整个集合中是否唯一?,mongodb,aggregation-framework,Mongodb,Aggregation Framework,mongo用户的小脑筋急转弯 我收集了一些文件,比如 { "_id" : ObjectId("19628f4f0545a733185b672f"), "name" : "hello", "items" : [ { "itemNumber" : 12512, "value" : "let" }, { "itemNumber" : 2546,

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
s都是唯一的。(可能有更好的方法在SQL中进行检查)

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

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

b) 做一个简单的聚合

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

有没有一种查询方法可以做到这一点


性能通知:收集的文件约为3万份,每份2.2 KB。我注意到,包含
$group
的aggregation在这个集合中像永远一样运行。

这样的东西怎么样:

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

此处描述的可能解决方案: