我想创建一个查询来检查我的数据库中的哪些文档具有相同的字段值。
例如,我存储了 100 个文档,其中 2 个看起来像这样:
文件 1:
{
"_id":32143242,
"specialField":12
}
文件 2:
{
"_id":787878,
"specialField":12
}
那么,如果我不知道 id 或 specialField-Value,如何获取这两个文档呢?
我想创建一个查询来检查我的数据库中的哪些文档具有相同的字段值。
例如,我存储了 100 个文档,其中 2 个看起来像这样:
文件 1:
{
"_id":32143242,
"specialField":12
}
文件 2:
{
"_id":787878,
"specialField":12
}
那么,如果我不知道 id 或 specialField-Value,如何获取这两个文档呢?
这是可以使用MongoDB 聚合框架执行的分组操作。
样本数据
> db.foo.find().pretty();
{ "_id" : ObjectId("515ead9c7bb40c6a51b16a68"), "Value" : 12 }
{ "_id" : ObjectId("515ead9d7bb40c6a51b16a69"), "Value" : 12 }
{ "_id" : ObjectId("515ead9f7bb40c6a51b16a6a"), "Value" : 14 }
{ "_id" : ObjectId("515eada07bb40c6a51b16a6b"), "Value" : 8 }
样本分组操作
> db.foo.aggregate({$group :
{ _id: "$Value",
count : {$sum : 1},
ids: { $addToSet : "$_id" } } });
这将返回相等的组Value
以及它们的计数和各自的 id:
{
"result" : [
{
"_id" : 8,
"count" : 1,
"ids" : [
ObjectId("515eada07bb40c6a51b16a6b")
]
},
{
"_id" : 14,
"count" : 1,
"ids" : [
ObjectId("515ead9f7bb40c6a51b16a6a")
]
},
{
"_id" : 12,
"count" : 2,
"ids" : [
ObjectId("515ead9d7bb40c6a51b16a69"),
ObjectId("515ead9c7bb40c6a51b16a68")
]
}
],
"ok" : 1
}
您应该阅读聚合框架的文档并了解其局限性。