У меня есть база данных, содержащей коллекции, и эти коллекции, содержащих документы по форме:Найти максимальное значение поля во всех коллекциях
{ "_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();
}
Это работает, но я не думаю, что он очень эффективен. У кого-нибудь есть какой-нибудь вклад или совет?
EDIT: я в конечном итоге делает это:
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 Исправлено! –
Также можно комбинировать последние две петли. Добавление элементов в список внутри цикла, только для повторения этого нового списка позже, не нужно. –