Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 在Casbah发行版中创建索引_Mongodb - Fatal编程技术网

Mongodb 在Casbah发行版中创建索引

Mongodb 在Casbah发行版中创建索引,mongodb,Mongodb,我的程序将执行以下操作(使用Casbah): 从头开始mongod,然后运行我的测试时,索引工作。运行测试后,我检查db.collection.getIndexes()以查看它是否已创建 但是,在运行一次测试,然后运行db.collection.drop()之后,我重新运行了测试。测试正确地插入了文档,但错误地报告创建了索引。我之所以这样说,是因为即使打印出了索引的X秒,MongoShell的db.collection.getIndexes()也表明它没有被创建 为什么collection.en

我的程序将执行以下操作(使用Casbah):

从头开始
mongod
,然后运行我的测试时,索引工作。运行测试后,我检查db.collection.getIndexes()以查看它是否已创建

但是,在运行一次测试,然后运行
db.collection.drop()
之后,我重新运行了测试。测试正确地插入了文档,但错误地报告创建了索引。我之所以这样说,是因为即使打印出了索引的X秒,MongoShell的
db.collection.getIndexes()
也表明它没有被创建

为什么
collection.ensureIndex(MY_INDEX)
不总是在索引不存在时创建索引

编辑

当通过
collection.ensureIndex(MY_index)
添加索引时,Casbah调用Java库的方法来创建索引。在此方法中,使用此索引更新私有映射变量\u createdIndex

当我在Java库的之外修改Mongo的索引时,它不知道如何更新\u createdIndex变量。因此,当尝试创建相同的索引时,\u createdIndex已经有了该值,因此它只调用
return因为库的缓存(即变量)已将此索引放入其映射中

为了解决这个问题,我调用了
collection.dropIndexes()
,这将清除\u createdIndexes变量

Casbah源代码
-

Java源代码
-


请参阅的详细答案了解完整情况。

这不是sae的一个bug,但是,我同意如果您同时使用Casvah驱动程序和shell或其他驱动程序,这会突出一个问题

底层java代码缓存不知道您在shell中做什么,它期望成为唯一的true源(其他驱动程序也遵循此模式)。存在缓存的原因是为了提高性能,因此可以重复调用ensureIndex,并且对性能影响很小

所以问题是,在这种情况下,什么是最好的行动方案

  • 仅使用Casbah驱动程序创建和管理索引—ensureIndex所依赖的是什么
  • 仅使用shell创建和管理索引-shell不缓存
  • 不要信任Casbah代码中的缓存

  • 您可以调用
    createIndex
    并完全绕过缓存。这上面有一个jira问题:它会查找下一个主要版本(3.0),缓存将被删除。

    您遇到了一些非常奇怪的问题,无法仅使用该代码进行调试。您在代码中使用了
    MY_INDEX_NAME
    ,但在问题中使用了
    MY_INDEX
    。最后显示对
    ensureIndex
    的第二次调用。Mongo shell比Casbah使用得更多,请尝试在那里重现问题(插入一个文档就足够了)。很抱歉,MY_u索引字段是相同的-拼写错误。这可能是Mongo错误。我给一位维护Casbah的软件工程师发了电子邮件。一旦我听到这个人的消息,我会有更多的消息。
    load2000DocsIntoMongo() 
    def myIndexExists= collection.getIndexInfo().exists( x => x.getAs[String] 
             ("name").getOrElse("") == MY_INDEX_NAME)
    if (myIndexExists) println("log exists")
    else { 
      val start = System.nanoTime()
      collection.ensureIndex(MY_INDEX) 
      println( (System.nanoTime - start) / 1000000000 + "seconds to index")
    }