选择不同的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();