根据文档 count
和distinct
查询应该导致op
=count
和op
= distinct
in system.profile
。但是,当我尝试在 shell 中运行此类查询时,它们都生成为op
= command
。
> db.p.count()
23
> db.p.distinct("item")
[ "pencil", "eraser" ]
> db.system.profile.find().sort({$natural: -1}).limit(2).pretty()
{
"op" : "command",
"ns" : "test.p",
"command" : {
"distinct" : "p",
"key" : "item",
"query" : {
}
},
(...)
}
{
"op" : "command",
"ns" : "test.p",
"command" : {
"count" : "p",
"query" : {
},
"fields" : {
}
},
(...)
}
因为remove
这个工作非常好,我执行remove
并得到op
= remove
in system.profile
。
> db.p.remove({item: "pen"})
WriteResult({ "nRemoved" : 0 })
> db.system.profile.find().sort({$natural: -1}).limit(1).pretty()
{
"op" : "remove",
"ns" : "test.p",
"query" : {
"item" : "pen"
},
(...)
}
最初,MongoDB 中的所有数据库操作都是在Wire Protocol中编码的。但是,这意味着创建新命令将涉及:
这种方法的另一个缺点是操作码的格式不能在不改变线路协议版本的情况下改变。随着更多特性的引入,这种情况将变得不可避免,并且有可能在未来更频繁地发生。
为了克服这个限制,新版本的 MongoDB 开始将现有的有线协议功能迁移到它的命令形式中。例如,查询和写入操作命令文档页面中详细介绍了 CRUD 操作的命令形式。
这就是为什么有些操作记录为命令,有些操作记录为实际线路协议代码的主要原因。最终,命令形式将成为未来的首选形式。
没有描述此移动的单一通用票证,但DOCS-7489票证描述了司机的过程。
有关有线协议的即将到来的驱动程序更改的更深入的技术细节,请参阅MongoDB 3.6 的新驱动程序功能,特别是关于
OP_MSG
.