Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么MongoDB更新字段如此CPU密集?_C#_Mongodb - Fatal编程技术网

C# 为什么MongoDB更新字段如此CPU密集?

C# 为什么MongoDB更新字段如此CPU密集?,c#,mongodb,C#,Mongodb,我有一个用C#编写的社交帖子爬虫程序,带有MongoDB WiredTiger(3.2.3)存储 我在测试服务器上收集了400.000个文档,其中包含2核Xeon和7GB内存,Windows server 2012。现在Mongod需要2.7GB的内存 文档看起来像: public class Post { public Guid Id { get; set; } public string SysId { get; set; } public Guid SiteId

我有一个用C#编写的社交帖子爬虫程序,带有MongoDB WiredTiger(3.2.3)存储

我在测试服务器上收集了400.000个文档,其中包含2核Xeon和7GB内存,Windows server 2012。现在Mongod需要2.7GB的内存

文档看起来像:

public class Post
{
    public Guid Id { get; set; }

    public string SysId { get; set; }

    public Guid SiteId { get; set; }

    public DateTime Date { get; set; }

    public string Type { get; set; }
    public string Text { get; set; }

    public string ImageUrl { get; set; }

    public User User { get; set; }

    public bool IsApproved { get; set; }
}
带索引

{
    "SiteId" : 1,
    "IsApproved" : -1,
    "Date" : -1
}
在我的UI中,我有一个带有以下代码的批准切换按钮:

    ....
    var collection = database.GetCollection<Post>("Posts");

    var postStatus = await collection.AsQueryable().Select(x => new { x.Id, x.IsApproved }).FirstOrDefaultAsync(x => x.Id == postId);

    if (postStatus == null)
          throw new EntityNotFoundException<Guid>(post.Id);

    var filter = Builders<Post>.Filter.Eq(post => post.Id, postId);
    var update = Builders<Post>.Update.Set(x => x.IsApproved, !postStatus.IsApproved);

    await collection.UpdateOneAsync(filter, update);
。。。。
var collection=database.GetCollection(“Posts”);
var postStatus=await collection.AsQueryable().Select(x=>new{x.Id,x.IsApproved}).FirstOrDefaultAsync(x=>x.Id==postId);
if(postStatus==null)
抛出新EntityNotFoundException(post.Id);
var filter=Builders.filter.Eq(post=>post.Id,posted);
var update=Builders.update.Set(x=>x.IsApproved,!postStatus.IsApproved);
wait collection.UpdateOneAsync(过滤器,更新);

当我多次按下Approve按钮时,我看到CPU的利用率为100%,5秒钟后一切正常。为什么最简单的操作会占用大量CPU?看起来很糟糕…

使用的是什么存储引擎?我使用的是WiredTiger storage v3.2.3。我怀疑这是一个通用的MongoDB问题,而是MongoDB在等待IO。我不明白为什么要使用异步操作,然后使用阻塞“wait”。这很可能会导致更多的开销,而不是任何好处。这只是一个粗略的猜测,但异步的东西会导致IO中断吗?像这样进行查找/更新分离也可能不是最明智的设计选择。更好的方法是使用“使用更新”操作符中描述的内容,并选择“切换”每次更新的值。因此,只需在这里应用一个
.updateOneAsync()
就可以减少很多IO。尼尔·伦恩,谢谢!但是,如果在许多其他更新中使用近似值,它看起来就不太好了。