我必须从简单的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();
但我不知道如何从数据库中选择不同的单词。 有人可以给我一些建议吗?
答案 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 旧版
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();