mongodb 在记录更新时告诉我什么?

bma*_*ies 6 mongodb upsert

在将大量数据推送到 mongo 的大型程序几分钟后,我的日志开始显示(我猜)每次更新的消息。这看起来非常嘈杂,是否有什么特殊原因需要这样做?

Tue Jun  5 14:32:37 [conn3] update benchmark.entity  
 query: { corefEntityId: "45-LOCATION" } 
 update: { $set: { corefEntityId: "45-LOCATION", type: "Location" },
 $push: { indocs: { docid: "cfcc403b-714f-4c5d-8507-ccb5b6354654", 
   ordinal: 26, label: "United States", mentions: [ "United States" ] } }, 
   $addToSet: { allMentions: { $each: [ "United States" ] } }, 
   $inc: { documentCount: 1 } } 116ms
Run Code Online (Sandbox Code Playgroud)

作为一个可能更容易回答的脚注,我想知道:与将普通插入到内部文档的其他集合中作为顶级文档相比,添加到某些内部文档的“upsert”是否更快或更慢?

Ada*_*m C 4

我认为你的意思是 upsert 而不是 upstart (upstart 是 Ubuntu 系统上的一种工作)。Upsert 的意思是“如果存在则更新文档;如果缺失则插入(单个文档)”。MongoDB 仅通过检查您传递给它的标准文档来确定文档丢失。

确定文档是否存在的查询可能是这里最慢的部分。您应该仅对查找运行解释,以确定它是否正确使用索引并且是否具有应有的效率:

http://www.mongodb.org/display/DOCS/Explain

如果它不使用索引,那么您应该添加一个以加快速度。根据此示例是否是您的查询计划的典型示例,我预计“corefEntityId”上的索引至少是一个好主意。如果在其他情况下查找更复杂,您可能需要查看复合索引并使用提示来查看哪个是最佳的:

http://www.mongodb.org/display/DOCS/Optimization#Optimization-Hint

就日志记录而言 - 当它记录像您在示例中看到的那样的查询时,原因是因为默认的“slowms”值为 100。也就是说,MongoDB 将记录每个需要超过 100 毫秒才能完成的查询。可以这样调整:

http://www.mongodb.org/display/DOCS/Database+Profiler#DatabaseProfiler-EnablingProfiling

例如,如果您想将其设置为 200ms:

db.setProfilingLevel(1,200)
Run Code Online (Sandbox Code Playgroud)