在一个句点中查找一个字段的不同值
本文关键字:一个 句点 查找 字段 | 更新日期: 2023-09-27 18:26:33
我有一个包含以下字段的表(detecc):
uname string
door string
dt double (seconds since 1/1/1970)
我有一个运行良好的查询:
double dt1= SeconsdSince1970(DateTime.Now);
double dt0= dt1 - 3600;
var doorSearch = new string[] { "D1", "D2" };
System.Int32 cNow = (from d in detecc
where doorSearch.Contains(d.door) &&
(d.dt >= dt0 && d.dt <= dt1)
select d.uname).Distinct().Count();
但如果我想检索用户(uname),我会得到所有记录(重复):
double dt1= SeconsdSince1970(DateTime.Now);
double dt0= dt1 - 3600;
var doorSearch = new string[] { "D1", "D2" };
var lisUname = (from d in detecc
where doorSearch.Contains(d.door) &&
(d.dt >= dt0 && d.dt <= dt1)
select d.uname).Distinct();
如何获得不同的用户名?
如果您正在使用mongodb集合,请尝试
// .ToList() converts to poco list
var lisUname = (from d in detecc
where doorSearch.Contains(d.door) &&
(d.dt >= dt0 && d.dt <= dt1)
select d.uname).ToList();
// distinct is now executed in c# context rather mongodb context
var distinctList = lisUname.Distinct();
更简洁的语法
var list = detecc
.Where(d => doorSearch.Contains(d.door) && (d.dt >= dt0 && d.dt <= dt1)
.Select(x => x.uname)
.ToList();
性能
注意:.Select将始终结束查询并将所有数据(完整文档)传递给本机代码。因此,您可以从服务器获取完整的数据,然后您的代码就可以选择所需的字段。如果只想提取请求的字段,则需要另一种mongodb查询方法。
请参阅Linq驱动程序文档
为了在不同用途方面获得更好的性能:
var list = detecc
.Where(d => doorSearch.Contains(d.door) && (d.dt >= dt0 && d.dt <= dt1)
.Distinct() // that way distinct is executed on server side
.ToList();
为什么使用mongodb链接.Count()不起作用
.Count()是指与自己的参数单独使用。请参阅本文为什么MongoDB Count属性返回所有记录
// Example
int userCount = db.GetCollection("detecc")
.Count(Query.EQ("uname", searchedUName));
一种更具性能的聚合方法
为了获得更高性能的方法,请使用类似的mongodb聚合
db.collection.aggregate([
{ "$match": { "$and": [ { "prop1": "" }, { "prop2": "" } ] } },
{ "$group": { "_id": "$messageId" } }
])
请参考这个答案:MongoDb Distinct与查询C#驱动程序