MongoDB:如何检查所有数组项在整个集合中是否唯一?
mongo用户的小脑筋急转弯 我收集了一些文件,比如MongoDB:如何检查所有数组项在整个集合中是否唯一?,mongodb,aggregation-framework,Mongodb,Aggregation Framework,mongo用户的小脑筋急转弯 我收集了一些文件,比如 { "_id" : ObjectId("19628f4f0545a733185b672f"), "name" : "hello", "items" : [ { "itemNumber" : 12512, "value" : "let" }, { "itemNumber" : 2546,
{
"_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 } } }
)
此处描述的可能解决方案: