我想知道如何使用mongoDB和C#检查对象是否存在。
我找到了一种方法,但是由于Any()方法,我不得不使用Linq,但是我想知道没有Linq可以做到吗?
database.GetCollection<ApplicationViewModel>("Applications").Find(Query.EQ("Name", applicationName)).Any()
谢谢你们!
答案 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.Exists
和Query.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%