我需要对需要在数组中旋转一些值的文档执行更新操作.MongoDB的更新查询目前不允许你$pop,然后$push在更新同一领域.在网上搜索建议后,我认为db.eval()最适合我的使用,因为它确保了原子性,我正在执行的操作非常短,因此它不会长时间锁定数据库.
这是我正在尝试做的事情的一个例子:
db.eval(function (id, newVal) {
doc = db.collection.findOne({_id: id});
doc.values.shift();
doc.values.push(newVal);
db.collection.save(doc);
}, id, newVal);
Run Code Online (Sandbox Code Playgroud)
这完美地运作!然后我启用了mongoDB分析,看看eval()命令花了多少毫秒,我总是得到少于1毫秒的结果:
> db.system.profile.find({op: "command"}, {"millis": 1})
{ "millis" : 0 }
{ "millis" : 0 }
...
Run Code Online (Sandbox Code Playgroud)
这对我来说是个好消息,除了我的应用程序是在python中,所以我使用pymongo客户端来执行eval()命令.(上面的数据来自mongo shell)但现在,当我eval()使用pymongo 运行相同的命令时:
conn = pymongo.Connection(mongo_server_hostname)
db = conn.my_db
db.eval("""function (id, newVal) {
doc = db.collection.findOne({_id: id});
doc.values.shift();
doc.values.push(newVal);
db.collection.save(doc);
}""", id, new_val)
Run Code Online (Sandbox Code Playgroud)
我得到了非常不同的分析结果:
> db.system.profile.find({op: "command"}, {"millis": 1})
{ "millis" : 13 }
{ …Run Code Online (Sandbox Code Playgroud) 我目前正在研究Go Lang教程,但遇到了其中一个练习的问题:
https://tour.golang.org/methods/23
练习让我实现了一个ROT13密码.我决定使用从字节到旋转值的映射来实现密码,但我不确定初始化此映射的最佳方法.我不想使用文字初始化地图,但更喜欢通过循环遍历字母表并在循环内设置(键,值)对来编程.我还希望只能从Rot13Reader结构/对象访问该地图,并让所有实例(?)共享相同的地图(而不是每个Rot13Reader一个副本).
这是我目前正在进行的Go计划:
package main
import (
"io"
"os"
"strings"
)
type rot13Reader struct {
r io.Reader
}
var rot13Map = map[byte]byte{}
func (rotr *rot13Reader) Read(p []byte) (int, error) {
n, err := rotr.r.Read(p)
for i := 0; i < n; i++ {
if sub := rot13Map[p[i]]; sub != byte(0) {
p[i] = sub
}
}
return n, err
}
func main() {
func() {
var uppers = []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
var lowers = []byte("abcdefghijklmnopqrstuvwxyz")
var init = func (alphabet …Run Code Online (Sandbox Code Playgroud)