2011-11-08 45 views

回答

7

对于任何上述建议是有效的,你应该确保有一个index元素。否则,将需要完整的收集扫描。

如果您只希望答案是0或1,count可能是最有效的方法。如果您认为计数会非常大,并且您真正关心的是是否有一个或多个,FindOne是最有效的方法。

FindOne可能无关紧要地返回整个文档,除非文档实际上相当大。在这种情况下,你可以告诉服务器只返回一个字段(_id似乎是最有可能的候选人):MongoDB中关键的

var query = Query.EQ("url", "http://stackoverflow.com"); 
var fields = Fields.Include("_id"); 
var res = collection.Find(query).SetFields(fields).SetLimit(1).FirstOrDefault(); 
if (res == null) { 
    // no match found 
} 
+1

如果你使用“var fields = Fields.Include(”url“)。Exclude(”_ id“),那么URL上的索引将是一个覆盖索引,并且能够提供结果而不从文档本身加载任何东西。 – Appetere

2

你只需要检查由该查询返回的项数通信:

int count = collection.FindAs<Item>(Query.EQ("url", "http://stackoverflow.com")).Count(); 
if(count > 0) 
{ 
    //do some stuff 
} 
+1

难道不证明这从长远来看将ineffecient作为整个集合会被搜索,而不是能够找到的第一个后返回? –

1
IMongoQuery query = Query.EQ("url", "http://stackoverflow.com"); 
var res = collection.FindOne(query); 
if(res == null)//don't exist 
{ 

} 
+0

这是不是有点低效,因为它返回整个对象而不仅仅是一个布尔值? –

0

存在,可以通过检查已存在和第二个参数为真或假

var filter = builder.Exists("style", false); 
var RetrievedData = collection.Find(filter).ToList() 

Refference Link

相关问题