MongoDB如何检查是否存在

本文关键字:是否 存在 检查 何检查 MongoDB | 更新日期: 2023-09-27 17:59:45

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

我已经找到了一种方法,但由于Any()方法,我不得不使用Linq,但我想知道如果没有Linq,是否可以做到这一点?

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

谢谢大家!

MongoDB如何检查是否存在

使用$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.ExistsQuery.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方法;)