MongoDB如何检查是否存在

Joh*_*ohn 16 .net c# mongodb mongodb-.net-driver

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

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

database.GetCollection<ApplicationViewModel>("Applications").Find(Query.EQ("Name", applicationName)).Any()
Run Code Online (Sandbox Code Playgroud)

多谢你们!

And*_*ich 18

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

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

if(count > 0)
{
   //then doc exists
}
Run Code Online (Sandbox Code Playgroud)

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

database.GetCollection<ApplicationViewModel>("Applications")
                  .Find(Query.Exists("Name", true));
Run Code Online (Sandbox Code Playgroud)

  • 在 C# 驱动程序中,`var count = _collection.Find(filter).Limit(1).CountAsync().Result;` (3认同)
  • 任何形式的计数都会计算所有匹配的文档。这可能是比使用 ANY 运算符更复杂的操作,如果找到一个匹配的记录,ANY 运算符将立即返回。因此,ANY(请参阅@i3arnon)对于检查是否存在更有效。 (2认同)

i3a*_*non 11

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

bool exists = collection.Find(_ => _.Name == applicationName).Any();
Run Code Online (Sandbox Code Playgroud)

或异步:

bool exists = await collection.Find(_ => _.Name == applicationName).AnyAsync();;
Run Code Online (Sandbox Code Playgroud)


i3a*_*non 8

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

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

这将创建一个count命令并验证它是否高于零.

在某些情况下(性能是一个问题)而不是计算所有匹配的文档,你可以简单地告诉MongoDB得到第一个并检查是否有一个:

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

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


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

  • 这当然是正确的。有些人只是用低票作为惩罚。 (2认同)