Я обновил mongo-java-driver (2.11.3 => 3.9.0) и mongo (2.6 => 4.0.5), и моя функция eval()
с function(source, target){db.getCollection(source).copyTo(target)}
начала выдавать исключение:
[ERROR] ' on server localhost:27017. The full response is { "ok" : 0.0, "errmsg" : "Error: {\n\t\"ok\" : 0,\n\t\"errmsg\" : \"can't send a shardVersion with the 'eval' command, since you can't use sharded collections from 'eval'\",\n\t\"code\" : 20,\n\t\"codeName\" : \"IllegalOperation\"\n} :\n_getErrorWithCode@src/mongo/shell/utils.js:25:13\nDB.prototype.eval@src/mongo/shell/db.js:752:1\nDBCollection.prototype.copyTo@src/mongo/shell/collection.js:906:1\n@:1:27\n", "code" : 139, "codeName" : "JSInterpreterFailure" }
[ERROR] at com.gwtplatform.dispatch.rpc.server.AbstractDispatchImpl.doExecute(AbstractDispatchImpl.java:164)
....
[ERROR] at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
[ERROR] at java.lang.Thread.run(Thread.java:748)
[ERROR] Caused by: com.mongodb.MongoCommandException: Command failed with error 139 (JSInterpreterFailure): 'Error: {
[ERROR] "ok" : 0,
[ERROR] "errmsg" : "can't send a shardVersion with the 'eval' command, since you can't use sharded collections from 'eval'",
[ERROR] "code" : 20,
[ERROR] "codeName" : "IllegalOperation"
[ERROR] } :
Я понимаю, что не могу использовать eval с осколочными коллекциями.Документация Mongo:
Нельзя использовать db.eval () с осколочными коллекциями.В общем, вы должны избегать использования db.eval () в сегментированных кластерах;тем не менее, можно использовать db.eval () с неэкранированными коллекциями и базами данных, хранящимися в сегментированном кластере. db.eval ()
Однако мои коллекции не очищены (это работало с предыдущими версиями mongo и драйвера).
все же я проверил набудь уверен (поправь меня, если я ошибаюсь):
Команда: db.getCollection("collection").getShardDistribution()
Результат: Collection db.collection is not sharded.
Есть идеи?
Забыли добавить код Java, который использует драйвер:
import com.mongodb.DB;
DB db = ...;
db.eval(COPY_COLLECTION_FUNCTION, name, targetName);