MongoDB .Net Driver 2.x - 如何执行存储的 JS 函数
Posted
技术标签:
【中文标题】MongoDB .Net Driver 2.x - 如何执行存储的 JS 函数【英文标题】:MongoDB .Net Driver 2.x - How to execute stored JS function 【发布时间】:2015-08-13 10:22:35 【问题描述】:我在 MongoDB 中有一个存储的 JS 函数,如 Optimistic Loop pattern 我需要用MongoDB C#/.NET driver 2.0.1 -MongoDb version 3.0.5-来执行它。
我可以像这样从 MongoDB shell 执行它:
myFunc(by:"Bob", on:ISODate("2015-10-02T01:11:18.965Z"), db.myCollection)
db.Eval
一直是deprecated since 3.x:
我想也许db.runCommand()
可能会做我想做的事。但无法弄清楚如何用JsonCommand
/ObjectCommand
/BsonDocumentCommand
RunCommand(String)
实际表示函数调用似乎也已被弃用。
那么如何从 C#/.NET 客户端运行存储函数?
编辑 1: 我本可以在 C# 中实现该模式,但不希望在写入之前读取的开销,如果在 MongoDB 服务器上运行肯定会更快。
编辑 2:
到目前为止,我明白我的编辑 1 中的语句是错误的,因为如果我在 C# 中实现模式,从 mongo.exe
客户端运行函数将进行相同数量的调用,因此使用 JS 函数实现自动递增计数器没有任何好处。
【问题讨论】:
如果您在“shell”中这样运行,那么它实际上并不是在“服务器”上运行,而是在“客户端”上运行(db.loadServerScripts()
就是这样做的),这是唯一的方法在服务器上运行是在“eval”内或在像 mapReduce 或 $where
这样的 javascript 处理器内。两者都有限制和“警告”。几乎所有你认为你“需要”服务器端 JavaScript 的东西都可以在提供的本机方法中更好地实现。
@BlakesSeven,是的,我从 shell 运行东西,我是否理解正确,如果我要在 C# 中实现 Optimistic Loop 模式(读取和写入的双重旅程),那么我将不会获得速度(通过节省旅程计数)同样会从外壳发生吗?谢谢!
您需要“正确”理解的是,在 JavaScript 引擎中执行服务器端代码存在固有问题,就像您认为自己正在编写的任何“流控制”操作一样。您只是“认为”您需要它,因为您当前的设计和解决您真正遇到的问题的方法。您真正“应该”做的是重新考虑所需的设计,并可能提出有关您想要解决的问题的问题,这些问题首先促使您进行设计。如果您这样做,其他人可能会提出更好的方法。事情被“弃用”是有充分理由的。
@BlakesSeven 让我删除这个要求:我需要一个自动递增的 id。独立于持久性技术,涉及这种模式的设计本身并没有错。同意? MongoDb 官方教程建议使用服务器端 JS 来完成。你说它本身是错误的。美好的。那么应该如何实现这样一种通用模式呢?
哪个教程?我不知道这样的事情。我认为您所指的是根本不使用服务器端JavaScript,而是使用.findAndModify()
在表中设置序列计数器。至于独立的,良好的存储 JavaScript 需要一个引擎来做到这一点,所以它听起来不是很独立。如果你可以做一个“完全”独立的存储逻辑,那么祝你好运。这样的实现有一种通过尝试通用来忽略更好特性的方法。无论如何,您以这种形式提出的问题会自行回答。调用“评估”。如果您想要更好的选择,请按照我的建议询问其他人。
【参考方案1】:
我想你可以用这个:
var cmd = new JsonCommand<BsonDocument>(" eval: \"myFunc(by:\"Bob\", on:ISODate(\"2015-10-02T01:11:18.965Z\"), db.myCollection)\" ");
var result = db.RunCommand(cmd);
【讨论】:
以上是关于MongoDB .Net Driver 2.x - 如何执行存储的 JS 函数的主要内容,如果未能解决你的问题,请参考以下文章
C# .Net + MongoDB Atlas 连接字符串 MongoDB.Driver.Legacy 尝试运行客户端时出错