2011-06-20 186 views
10

我想知道如何检查与mongoDB和C#的对象的存在。MongoDB如何检查存在

我已经找到了一种方法来做到这一点,但我不得不使用Linq感谢Any()方法,但我想知道是否有可能没有Linq做到这一点?

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

谢谢你们!

+0

为什么不LINQ? – Mauro

+0

没有Linq,因为我不想处理内存中的元素列表。 – Gui

回答

14

使用$count操作,以避免内存问题,这不加载从数据库文件到内存:

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

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

MongoDB中操作$exists可用于identfy,一些领域的文件存在,但你不能传递查询到它:

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

嗨安德鲁,我们如何过滤你写的东西?我的意思是,我如何指定我想知道是否存在任何LedgerDocument.Name == SomethingName? – Gui

+0

@JohnSmith:对不起,这是我的错误,看到我用正确的代码更新了我的答案。 –

+0

非常感谢你的回答,你让我的一天。你的代码工作得很好。我给你1票+接受的答案。 – Gui

0

我会建议在官方教程

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

你可以找到再算上获得生存所描绘的方法。

编辑: 对于固定内存问题,现在看来,这“存在”,在MongoCollection对象Exists方法;)

+0

如果内存问题,我认为这个答案是不值得的,对不对? – Mauro

+0

为内存编辑 – Mauro

+0

在我的情况下,内存实际上不是问题。我只是想知道10gen的C#驱动程序是否提供了一种“官方”方法来检查文档的存在。因为我用mongo语法看到了这个关键字,你可以在这里看到http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24exists但是我不知道是否在C#中有类似的东西...... – Gui

1

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

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

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

3

最简单的,类型/重构安全的选择是使用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查询(转换为蒙戈查询,因此不存在内存问题)。

+1

这当然是正确的。有些人只是使用降价作为惩罚。 – i3arnon

+0

Mongo驱动程序不支持所有的linq查询。 “不支持的过滤器:所有({document} {subscribers} .Where(({document} {userId}!= \”1234 \“)))。 –

1

检查2中是否存在的方法。驱动程序的X版本是:

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

或异步:

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