2017-10-10 68 views
1

我正在使用MongoDB作为我的数据库。每个文档中都有52个字段/ BsonElement/FieldNames。在我的收藏中,包含数百万份文件。排除字段如果它有重复

我的应用程序,使用.NET,有一个组合框/下拉控件,让用户选择一个唯一的主键/字段。我想知道如何检查一个字段是否有任何重复的值。如果有的话,我不会在我的组合框控件中包含这个。

+0

发表您的收藏样本文件。 –

+0

[Image Reference](https://ibb.co/hiYpvb) – Hobert

+0

我已经添加了如何查询它的答案,但在.NET中建立查询我需要看看你如何使用驱动程序。 –

回答

2

我们可以在聚合管道中使用groupby,统计所有唯一字段,然后将它们与总文档进行比较。

假设我们有以下数据:

[ 
    { 
    "_id":ObjectId("59dc805cf51b821565695ec8"), 
    "isDeleted": false, 
    "salutation": "Mr.", 
    "firstName": "Kevin", 
    "lastName" : "Smith" 
    },{ 
    "_id":ObjectId("59dc80d5f51b821565695ec9"), 
    "isDeleted": true, 
    "salutation": "Miss", 
    "firstName": "Helen", 
    "lastName" : "Smith" 
    },{ 
    "_id":ObjectId("59dc80dff51b821565695eca"), 
    "isDeleted": false, 
    "salutation": "Mr.", 
    "firstName": "Joe", 
    "lastName" : "Bloggs" 
    } 
] 

然后我们就可以运行下面的查询:

db.test.aggregate([ 
    { 
    $group: { 
     _id : null, 
     total: {$sum: 1}, 
     isDeleted: {$addToSet: "$isDeleted"}, 
     salutation: {$addToSet: "$salutation"}, 
     firstName: {$addToSet: "$firstName"}, 
     lastName: {$addToSet : "$lastName"}, 
    }, 
    },{ 
    $project: { 
     isDeleted: { $eq: [ "$total", {$size: "$isDeleted"} ]}, 
     salutation: { $eq: [ "$total", {$size: "$salutation"} ]}, 
     firstName: { $eq: [ "$total", {$size: "$firstName"} ]}, 
     lastName: { $eq: [ "$total", {$size: "$lastName"} ]} 
    } 
    } 
]); 

这将返回我们每个字段所有可能的值的文档:

{ 
     "_id" : null, 
     "isDeleted" : false, 
     "salutation" : false, 
     "firstName" : true, 
     "lastName" : false 
} 
+0

这将获得某个字段的唯一值,对吗?我想,所以.. 我想检查的是知道一个字段是否为重复值。如果字段的所有值/数据都是唯一的,那么我会将该字段作为我的主键包含在组合框中。 – Hobert

+0

改变了一下,只是计算结果:) –

+0

让我试试这个.NET,凯文。它可能需要一段时间。我不熟悉MongoDB方法。感谢帮助。 – Hobert

0

尝试distinct这将有助于我们在挑选只有唯一值

例如,如果有一个国家降下来(组合框),那么查询检索国家的唯一值是

db.collection.distinct("Country") 
+0

我不想获得一个字段的唯一值。我试图把我的名单放在字段中 - 每个字段的所有值都是唯一的。 – Hobert

+0

我想我会首先运行不同的,那么如果它等于collection.count,那么所有的值都是唯一的? – Hobert

0

感谢Kevin Smith的回答,我能够完成它。干杯〜

.NET相当于:

`Dim Aggregate = Collection.Aggregate. 
    Group(New BsonDocument From { 
     {"_id", BsonNull.Value}, 
     {"total", New BsonDocument From { 
      {"$sum", 1}}}, 
     {"isDeleted", New BsonDocument From { 
      {"$addToSet", "$isDeleted"}}}} 
). 
Project(
    New BsonDocument From { 
     {"isDeleted", New BsonDocument From { 
      {"$eq", New BsonArray From { 
       "$total", New BsonDocument From { 
        {"$size", "$isDeleted"}}}}}}} 
)`