MongoDB如何检查是否存在
本文关键字:是否 存在 检查 何检查 MongoDB | 更新日期: 2023-09-27 17:59:45
我想知道如何用mongoDB和C#检查对象的存在。
我已经找到了一种方法,但由于Any()方法,我不得不使用Linq,但我想知道如果没有Linq,是否可以做到这一点?
database.GetCollection<ApplicationViewModel>("Applications").Find(Query.EQ("Name", applicationName)).Any()
谢谢大家!
使用$count运算符来避免内存问题,它不会将文档从数据库加载到内存中:
int count = items.FindAs<LedgerDocument>(Query.EQ("name", appName)).Count();
if(count > 0)
{
//then doc exists
}
mongodb中存在的运算符$可以用来识别文档中存在的某个字段,但不能将查询传递给它:
database.GetCollection<ApplicationViewModel>("Applications")
.Find(Query.Exists("Name", true));
在2.x版本的驱动程序中检查是否存在的方法是:
bool exists = collection.Find(_ => _.Name == applicationName).Any();
或者异步:
bool exists = await collection.Find(_ => _.Name == applicationName).AnyAsync();;
最简单的类型/重构安全选项是将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;
正如Robert Stam所指出的,MongoCollection.Exists
和Query.Exists
在这种情况下都是不相关的。
*从1.4版(2012-03-27)起,驱动程序支持LINQ
查询(转换为mongo查询,因此不存在内存问题)。
使用CountDocument
方法:
long count = await items.CountDocumentsAsync(yourFilter, null, cancellationToken);
if(count > 0)
{
//document exists
}
MongoCollection.Exists检查集合本身是否存在,而不是特定文档是否存在。
Query.Exists($Exists的查询生成器版本)用于查询文档是否包含特定字段(按名称)。
没有"官方"方式来查询与查询匹配的文档是否存在,但Andrew Orsich建议使用count可能是最好的方式。我想补充的唯一一点是,如果你无论如何都要处理匹配的文档,那么你还不如继续使用Find的一些变体来查询它们。
从这篇文章中我们读到:
但是,使用find()+limit()要快得多,因为findOne()将始终读取并返回文档(如果存在)。find()只返回一个游标(或不返回),并且只在遍历游标时读取数据。
这意味着使用类似的东西
database.GetCollection<ApplicationViewModel>("Applications").Find(Query.EQ("Name", applicationName)).Limit(1)
可能是最快的。
我将建议官方教程中描述的方法
http://www.mongodb.org/display/DOCS/CSharp+Driver+教程#CSharpDriver教程FindandFindAsmethods
你可以找到,然后计数,以获得存在。
编辑:为了解决内存问题,它似乎"存在"MongoCollection对象中的exists方法;)