我有一个包含集合的数据库,包含窗体上的文档这些集合查找场最大值:在所有集合
{ "_id" : 4, "value" : 2 }
我想找到的最大"_id"
在一个有效的方式,所有的藏品。目前,我有一个工作方法:
public long getLastTimestamp()
{
var tempList = getChannelNames();
var channelList = new List<IMongoCollection<BsonDocument>>();
var docuList = new List<BsonDocument>();
foreach (var channel in tempList)
{
channelList.Add(_database.GetCollection<BsonDocument>(channel.name));
}
foreach (var channel in channelList)
{
var filter = Builders<BsonDocument>.Filter.Exists("_id");
var result = channel.FindAsync(filter).Result.ToList();
foreach (var docu in result)
{
docuList.Add(docu);
}
}
var timeList = new List<long>();
foreach (var docu in docuList)
{
Console.WriteLine(docu);
if (!docu["_id"].IsObjectId)
timeList.Add(docu["_id"].ToInt64());
}
return timeList.Max();
}
它的工作原理,但我不认为它是非常有效的。 有没有人有一些意见或建议?
编辑: 我落得这样做:
public long getLastTimestamp()
{
var filter = Builders<BsonDocument>.Filter.Exists("value");
return getChannelNames()
.Select(channel => _database.GetCollection<BsonDocument>(channel.name))
.SelectMany(channel => channel.FindAsync(filter).Result.ToList())
.Max(docu => docu["_id"].ToInt64());
}
你至少可以结合你的前两个'foreach'循环。 – C4u
啊,是的。愚蠢的我不是:P固定! –
最后两个循环也可以组合在一起。将项目添加到循环内的列表中,仅用于稍后再次循环此新列表是不必要的。 –