选择不同的mongodb C#

时间:2013-11-03 17:30:31

标签: c# mongodb

我必须从简单的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<Element> collection = database.GetCollection<Element>("text8");
    MongoCursor<Element> words = (MongoCursor<Element>)collection.FindAll();

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

6 个答案:

答案 0 :(得分:8)

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

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

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

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

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

答案 1 :(得分:1)

我的猜测是将“word”作为此db的索引。 然后使用一些linq在一个简单的表达式中查询它:     var res = col.Query()。选择(e =&gt; e.word).Distinct();

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

答案 2 :(得分:1)

这是我的工作

Collection.Distinct<string>("ColumnNameForDistinct", FilterDefinition<T>.Empty).ToListAsync()

答案 3 :(得分:0)

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

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

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

{ "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时,它将是每个单词出现次数的集合。

答案 4 :(得分:0)

MongoCollection.Distinct Method (String) V2.0 旧版

用于new version API like 2.4

FieldDefinition<yueyun.land,string> field = "FirstName";
var bx = _yueyunlands.Distinct<string>(field, Builders<yueyun.land>.Filter.Empty).ToList();

答案 5 :(得分:0)

如果您想先进行过滤,然后再进行区分,还可以在MongoDB方面进行所有这些操作,则可以使用以下示例。 在此示例中,我应用了一个过滤器,得到了不同的值,最后得到了计数:

        var filter = Builders<Logs>.Filter.Ne(x => x.Id, null);
        var count = collection.Distinct(x => x.Id, filter).ToList().Count();