选择不同的mongodb C#

我必须从简单的mongo db数据库中选择不同的记录。 我有很多简单的记录,这些记录看起来像这样:

{"word":"some text"} 

我的代码非常简单。

  const string connectionString = "mongodb://localhost"; var client = new MongoClient(connectionString); MongoServer server = client.GetServer(); MongoDatabase database = server.GetDatabase("text8"); MongoCollection collection = database.GetCollection("text8"); MongoCursor words = (MongoCursor)collection.FindAll(); 

但我不知道如何从数据库中选择不同的单词。 有人可以给我一些建议吗?

MongoDB API具有distinct聚合命令,该命令返回为集合中的指定键找到的不同值。 你也可以在C#Driver中使用它:

 var distinctWords = collection.Distinct("word"); 

其中collection – 是您示例中的实例。 此查询将返回集合中所有不同的字段字段值。

另外,正如@JohnnyHK在评论中提到的,你可以使用linq方法 ,因为它受C#驱动程序的支持:

 var distinctWords = collection.AsQueryable().Select(e => e.Word).Distinct(); 

我的猜测是让“word”成为这个数据库的索引。 然后使用一些linq在一个简单的表达式中查询它:var res = col.Query()。选择(e => e.word).Distinct();

这将导致读取索引中的所有单词。

MongoDB没有内置运算符来从查询中拆分字符串,因为没有办法拆分字符串,然后在其上运行“distinct”操作。

一种选择是创建MapReduce并在MapReduce代码中进行拆分并计算每个单词。 你不能只用C#代码来做这件事。

第二个也可能更简单的选择是将字段预分割为单词,以便您可以使用其中一个不同的运算符:

 { "word": [ "some", "text"] } 

然后:

 dbCollection.Distinct("word"); 

如果您只想将整个字符串视为“单词”而不是单独处理每个单词,这当然会起作用。 MapReduce不是实时的……伪代码将是:

 map = function() { var splits = this.word.split(' '); for(var i = 0, l = splits.length; i < l; i++) { emit(splits[i], 1); } } reduce = function(word, vals) { var count = 0; for(var i=0, l=vals.length; i < l; i++) { count += vals[i]; } return count; } 

运行MapReduce时,它将是每个单词出现次数的集合。

MongoCollection.Distinct方法(字符串)V2.0是Legacy

对于像2.4这样的新版API使用:

 FieldDefinition field = "FirstName"; var bx = _yueyunlands.Distinct(field, Builders.Filter.Empty).ToList();