MongoDB如何检查是否存在

时间:2011-06-20 12:40:04

标签: c# .net mongodb mongodb-.net-driver

我想知道如何使用mongoDB和C#检查对象是否存在。

我找到了一种方法,但是由于Any()方法,我不得不使用Linq,但是我想知道没有Linq可以做到吗?

database.GetCollection<ApplicationViewModel>("Applications").Find(Query.EQ("Name", applicationName)).Any()

谢谢你们!

7 个答案:

答案 0 :(得分:16)

使用$count运算符来避免内存问题,它不会将文档从数据库加载到内存中:

int count = items.FindAs<LedgerDocument>(Query.EQ("name", appName)).Count();

if(count > 0)
{
   //then doc exists
}

mongodb中的运算符$exists可用于识别文档中存在某些字段,但您无法将查询传递给它:

database.GetCollection<ApplicationViewModel>("Applications")
                  .Find(Query.Exists("Name", true));

答案 1 :(得分:5)

最简单的类型/重构安全选项是将LINQ *与AsQueryable一起使用:

var collection = database.GetCollection<ApplicationViewModel>("Applications");
var exists = collection.AsQueryable().Any(avm => avm.Name == applicationName);

这将创建一个计数命令并验证它是否高于零。

在某些情况下(性能是一个问题)而不是计算所有匹配的文档,您只需告诉MongoDB获取第一个并检查是否有一个:

var collection = database.GetCollection<ApplicationViewModel>("Applications");
var exists = collection.AsQueryable().FirstOrDefault(avm => avm.Name == applicationName) != null;

罗伯特·斯塔姆指出,在这种情况下,MongoCollection.ExistsQuery.Exists都无关紧要。


*从版本1.4(2012-03-27)开始,驱动程序支持LINQ个查询(转换为mongo查询,因此没有内存问题)。

答案 2 :(得分:3)

检查2.x版驱动程序中是否存在的方法是:

bool exists = collection.Find(_ => _.Name == applicationName).Any();

或异步:

bool exists = await collection.Find(_ => _.Name == applicationName).AnyAsync();;

答案 3 :(得分:1)

MongoCollection.Exists检查集合本身是否存在,而不是特定文档是否存在。

Query.Exists($ exists的查询构建器版本)用于查询文档是否包含特定字段(按名称)。

没有“官方”方式来查询是否存在与查询匹配的文档,但Andrew Orsich建议使用count可能是最好的方法。他们只是评论我要补充的是,如果你要处理匹配的文档,那么你可以继续使用Find的一些变体来查询它们。

答案 4 :(得分:0)

我会建议官方教程中描述的方法

http://www.mongodb.org/display/DOCS/CSharp+Driver+Tutorial#CSharpDriverTutorial-FindandFindAsmethods

你可以找到并计算存在。

编辑: 对于修复内存问题,似乎它“存在”MongoCollection对象中的Exists方法;)

答案 5 :(得分:0)

this文章中,我们读到:

  

但是,使用find()+ limit()的速度明显更快,因为findOne()将始终读取+返回文档(如果存在)。 find()仅返回一个游标(或不返回),并且仅当您迭代游标时才读取数据。

这意味着使用类似的内容:

database.GetCollection<ApplicationViewModel>("Applications").Find(Query.EQ("Name", applicationName)).Limit(1)

可能最快。

答案 6 :(得分:0)

使用enter方法:

Disc%