0

我似乎无法从命令行 .remove() 。如果我进入 mongo shell,我的查询工作正常,但不是直接来自 bash。

$ mongo mydatabase --eval 'db.mytable.remove({expires: {$lt: Math.round(new Date().getTime() / 1000)}})'
MongoDB shell version: 2.0.6
connecting to: mydatabase 

当通过 mongo shell 手动运行时,此命令需要数小时才能在我们的所有数据上运行。它会像上面一样从 bash shell 立即返回而不会出错。

我知道有数据,可以用类似的方法确认--eval

$ mongo mydatabase --eval 'printjson(db.mytable.findOne({expires: {$lt: Math.round(new Date().getTime() / 1000)}}))'
MongoDB shell version: 2.0.6
connecting to: mydatabase 
{
        "_id" : "39e493ccef9d58bf75d856f55fb269f6",
        "value" : "mydata",
        "expires" : NumberLong(1371486135)
}

任何想法为什么db.mytable.remove()失败而没有错误?

4

2 回答 2

1

我现在尝试使用 MongoDB shell 版本:2.2.2,它工作正常:

mongo test --eval 'db.things.remove({expires: {$lt: Math.round(new Date().getTime() / 1000)}})'

如果您尚未更新,请尝试将 MongoDB 更新到较新的版本,另外我听说最新的 mongoDB 版本使用 V8 Javascript 引擎可能很有用

于 2013-06-17T19:29:44.110 回答
0

在 shell 中,remove可能没有使用 getLastError,因此是异步的。如果您触发该命令,您可以检查db.currentOp()是否有任何命令正在运行。

您给定的查询也可能在 shell 中被解释为不匹配任何要删除的记录。确保 afind使用相同的查询返回数据。

可能2.0.6的shelljustOne默认使用第二个参数,让它找到并删除第一个匹配的记录,此时它会返回。您可以尝试传递一个显式的第二个参数false来强制它进入多记录模式。我没有要测试的 2.0.6 shell,但需要检查一下。

于 2013-06-17T21:57:14.633 回答