8

我必须从我的简单 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();

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

4

6 回答 6

12

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

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

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

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

var distinctWords = collection.AsQueryable<Element>().Select(e => e.Word).Distinct();
于 2013-11-03T19:59:23.730 回答
3

这项工作是给我的

Collection.Distinct<string>("ColumnNameForDistinct", FilterDefinition<T>.Empty).ToListAsync()
于 2020-01-17T16:09:02.887 回答
1

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

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

于 2013-11-03T17:52:03.423 回答
1

方法(MongoCollection.Distinct字符串)V2.0旧版

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

FieldDefinition<yueyun.land,string> field = "FirstName";
var bx = _yueyunlands.Distinct<string>(field, Builders<yueyun.land>.Filter.Empty).ToList();
于 2018-06-13T01:14:51.913 回答
1

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

        var filter = Builders<Logs>.Filter.Ne(x => x.Id, null);
        var count = collection.Distinct(x => x.Id, filter).ToList().Count();
于 2019-09-16T11:49:08.290 回答
0

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

一种选择是创建一个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 时,它​​将是每个单词出现次数的集合。

于 2013-11-03T20:00:50.500 回答