mongodb - 如何使用 cl-mongo 运行 findAndModify?

标签 mongodb common-lisp

我正在尝试在 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
  }

我尝试使用 db.run-command 运行 findAndModify。看了文档和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?

最佳答案

初步想法:updatequery存在在“findAndModify”的参数中,但也许它们“太深了” ",并且需要在传入的键值映射中处于“顶级”?

关于mongodb - 如何使用 cl-mongo 运行 findAndModify?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36117197/

相关文章:

node.js - .connect() 中的回调范围(nodejs、mongodb)

javascript - 无法从 Mongoose-Node 检索对象

python - Lisp 的 apply 和 funcall 与 Python 的 apply

mongodb - 在 MongoDB 中克隆一个集合

php - MongoDB/Doctrine : can't nest $or in $and

mongodb - 使用键值对将 mongo 数组转换为对象

common-lisp - 常见的 Lisp 案例和引用元素

linked-list - 使用普通的 lisp 展平列表

lisp - 关闭公共(public) : sbcl borks because standard readtable modified

lisp - 在 Common LISP 中更改中流字节宽度