【问题标题】:How can I convert mongo script to pure C# code by using native MongoDB.Driver?如何使用本机 MongoDB.Driver 将 mongo 脚本转换为纯 C# 代码?
【发布时间】:2019-07-25 06:25:38
【问题描述】:

如何使用“MongoDB.Driver”将以下 mongodb shell 脚本转换为 C#?下面的脚本在本地运行完美。脚本没有问题。但如果我将其发布为 Azure func。 “eval”操作员存在权限问题。所以我决定使用 MongoDb.Driver 将上面的脚本重写为 Native C#。我开发了下面的代码, 但是在 Azure 函数中运行时“eval”不起作用并引发错误:“Command eval failed: Command is not supported.”。我决定转换为纯 C# 代码。我该怎么做?


    Date.prototype.addDays = function(h) {    
   this.setTime(this.getTime() + (h*60*60*1000*24)); 
   return this;   
} 

var beforeDate = (new Date()).addDays(-7);
var totalDeleted = 0;

do
{

    var ids = db.klm
        .find({
            CreatedDate: {$lt: beforeDate},
            xyz: {$eq: null},
            abc: {$eq: null},
            Items: { $size: 0 }
        })
        .limit(100)
        .map(function (doc) { return doc._id; });

    totalDeleted += ids.length;

    //db.klm.remove({"_id": { "$in": ids }});

} while (ids.length > 0);

print("Deleted " + totalDeleted + " rows before " + beforeDate);

【问题讨论】:

  • 你卡在哪一部分了?
  • 你可以直接从c#执行mongo脚本,你能接受吗?
  • @HariHaran,这个脚本在本地运行良好。脚本没有问题。但如果我将其发布为 Azure func。 “eval”操作员存在权限问题。所以我决定使用 MongoDb.Driver 将上面的脚本重写为 Native C#。
  • 我猜@Ryan 已经为你解答了

标签: c# .net mongodb azure azure-functions


【解决方案1】:

以下内容将删除匹配过滤器的所有内容。它不会以 100 秒为单位批量删除,因为您的 shell 代码效率会降低。以下仅发出一个 mongodb 查询,该查询将负责删除所有匹配的记录。

var beforeDate = DateTime.UtcNow.AddDays(-7);

var filter = Builders<klm>.Filter
                          .Where(k =>
                                 k.createdDate < beforeDate &&
                                 k.abc == null &&
                                 k.xyz == null &&
                                 (k.items.Count() == 0 || k.items == null));

var result = collection.DeleteMany(filter);

Console.WriteLine($"Deleted {result.DeletedCount} documents created before {beforeDate.ToShortDateString()}");

更新: 以下将导致对每批 100 条记录进行 2 次查询。

var beforeDate = DateTime.UtcNow.AddDays(-7);
var totalDeleted = 0;
var ids = new List<ObjectId>();

do
{
    ids = collection.Find(k =>
                          k.createdDate < beforeDate &&
                          k.abc == null &&
                          k.xyz == null &&
                         (k.items.Count() == 0 || k.items == null))
                    .Limit(100)
                    .Project(k => k.Id)
                    .ToList();

    if (ids.Any())
    {
        collection.DeleteMany(k => ids.Contains(k.Id));
        totalDeleted += ids.Count();
    }               

} while (ids.Any());

Console.WriteLine($"Deleted {totalDeleted} documents created before {beforeDate.ToShortDateString()}");
Console.ReadLine();

【讨论】:

  • ,感谢您的回答,但来自云的 azure func 存在一些限制问题。你能在这个很棒的查询中添加限制吗?
  • @Penguen 我已经更新了批量删除的答案。
猜你喜欢
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-07
  • 2017-11-27
相关资源
最近更新 更多