Mongo命令行eval退出时没有错误

时间:2013-06-17 16:30:28

标签: bash mongodb

我似乎无法从命令行中删除.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()失败而没有错误的任何想法?

2 个答案:

答案 0 :(得分:1)

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

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

尝试将MongoDB更新为较新版本(如果尚未更新),再加上I heard mongoDB版本使用V8 Javascript引擎可能很有用

答案 1 :(得分:0)

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

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

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