MongoDB使用c#获取集合中所有键的名称

时间:2015-02-11 08:30:23

标签: c# mongodb

如何使用c#获取MongoDB集合中所有键的名称。 我正在使用mongocsharpdriver 我可以使用

获取所有记录

var collection1 = database1.GetCollection("Games").FindAll();

现在我需要键名来显示/使用它。我需要获取的集合的关键名称。 例如如果我有收藏品

{ "_id" : ObjectId("c3"), "GameID" : 20, "GameName" : "COD5", "Cost" : 100}
{ "_id" : ObjectId("c4"), "GameID" : 21, "GameName" : "NFS", "Publisher" : "EA"}
{ "_id" : ObjectId("c5"), "GameID" : 22, "GameName" : "CS", "Cost" : 200}

所以我应该得到像GameID,GameName,Cost,Publisher这样的密钥列表。

我也经历了MongoDB Get names of all keys in collection但是无法实现它,没有理解它& mapreduce有问题。

2 个答案:

答案 0 :(得分:2)

受到问题中链接的启发:

string map = @"function() { 
        for (var key in this) { emit(key, null); }
        }";
string reduce = @"function(key, stuff) { return null; }";
string finalize = @"function(key, value){
            return key;
        }";
MapReduceArgs args = new MapReduceArgs();
args.FinalizeFunction = new BsonJavaScript(finalize);
args.MapFunction = new BsonJavaScript(map);
args.ReduceFunction = new BsonJavaScript(reduce);
var results = collection1.MapReduce(args);
foreach (BsonValue result in results.GetResults().Select(item => item["_id"]))
{
    Console.WriteLine(result.AsString);
}

答案 1 :(得分:0)

这是一种非常低效但简单的方法

HashSet<string> keys = new HashSet<string>();
foreach (var rover in collection1.FindAll())
{
    rover.Names.ToList().ForEach(p => keys.Add(p));
}

请记住,无论如何实现,找到一组密钥总是必须迭代整个集合,因此在较大的集合中它会非常慢。

在较大的集合中使用Map / Reduce来解决这个问题是有道理的,因为这可以避免上面发布的解决方案所产生的所有数据传输和反序列化开销,但是你应该尽量避免做这样的事情< em> at all 。至少,不要在需要的地方同步进行。

如果您需要快速了解所有字段的集合,那么最好在写入期间跟踪字段并将字段列表存储在某个单独的集合中。< / p>