我正在尝试在 MongoDB 中实现一个简单的消息队列。但是我无法让 findAndModify 与 cl-mongo 一起工作。
在 mongo shell 中,我可以这样做(重新格式化以提高可读性):
> db.queue2.insert(
{
"data": "test",
"date_created": new Date(),
"date_updated": null,
"date_completed": null,
"state": 0
})
WriteResult({ "nInserted" : 1 })
> db.queue2.findAndModify(
{
query: {"state": 0},
update: {
$inc: {"state": 1},
$currentDate: {"date_updated": false}
}
})
{
"_id" : ObjectId("56e7142c3ade7afa5209bf0f"),
"data" : "test",
"date_created" : ISODate("2016-03-14T19:42:36.860Z"),
"date_updated" : null,
"date_completed" : null,
"state" : 0
}
> db.queue2.find()
{
"_id" : ObjectId("56e7142c3ade7afa5209bf0f"),
"data" : "test",
"date_created" : ISODate("2016-03-14T19:42:36.860Z"),
"date_updated" : ISODate("2016-03-14T19:43:10.499Z"),
"date_completed" : null,
"state" : 1
}
我可以在 cl-mongo 中使用
find
:> (pp (db.find "queue2" (kv "query" (kv "state" 0))))
{
"_id" -> objectid(56E858283ADE7AFA5209BF10)
"data" -> test
"date_created" -> CL-MONGO::BSON-TIME Tue Mar 15 2016 19:44:56 (GMT+1)
"date_updated" -> NIL
"date_completed" -> NIL
"state" -> 0.0d0
}
我尝试使用
findAndModify
运行 db.run-command
。阅读文档和cl-mongo代码,我认为应该这样调用:> (pp (db.run-command "findAndModify"
:arg (kv (kv "query" (kv "state" 0))
(kv "update" (kv "$inc" (kv "state" 1))))
:collection "queue2"))
{
"ok" -> 0.0d0
"errmsg" -> need remove or update
}
NIL
我尝试了一些变体,如
:findAndModify
,尝试在列表中传递参数等,但我一直收到相同的错误。我可能应该提一下,我对 Lisp 和 MongoDB 都是新手,所以如果我错过了一些明显的东西,我深表歉意。
如何使用 cl-mongo 运行 findAndModify?
最佳答案
最初的想法:update
和 query
都出现在“findAndModify”的参数中,但也许它们“太深”了,需要在传入的键值映射中成为“顶级”?
关于mongodb - 如何使用 cl-mongo 运行 findAndModify?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36117197/