您只使用EnsureIndex()一次,还是将evey文档插入数据库?

时间:2018-03-10 16:37:28

标签: c# .net litedb

我正在学习如何使用LiteDB。这是我用来将.Net对象插入数据库的一些C#代码:

     // Create new YacksProjectInfo object and insert it into the database
     YacksProjectInfo projectInfo = new YacksProjectInfo(AssemblyName, moduleNumber);
     yacksProjects.Insert(projectInfo);  // Id field generated automatically
     yacksProjects.EnsureIndex((YacksProjectInfo x) => x.ProjectName);
     yacksProjects.EnsureIndex((YacksProjectInfo x) => x.ModuleNumber);

换句话说,每次向数据库添加新对象时,我都会使用EnsureIndex()方法。但是我猜这不是必要的,你只需要在插入第一个对象后做一次。

有人可以确认每次都需要完成EnsureIndex(),或者一次是否足够?

1 个答案:

答案 0 :(得分:0)

我在这里找到了答案(在找到另外两个提出同样问题的人之后,我对于提出一个相当明显答案的问题略显尴尬):https://github.com/mbdavid/LiteDB/issues/789

引用:

“我是否需要在每次写入操作时将其称为EnsureIndex?”

“我想知道同样的事情。你什么时候调用EnsureIndex?你是在第一次将新集合添加到数据库来设置索引时使用它吗?或者你是否每次都需要使用它以调用GetCollection为例?文档对此并不十分清楚。“

回答@mbdavid,他创建了LiteDB:

“你需要在运行查询到数据库创建索引之前调用EnsureIndex如果需要。如果索引已经创建(使用相同的EnsureIndex),那么EnsureIndex将什么都不做。所以,要做得好,最好的地方是创建你的所有索引都在数据库初始化“

顺便说一下,我在使用EnsureIndex()时也学到了别的东西 - 它有第二个参数“unique”,一个bool值。所以我猜测设置为真(当相关时)会稍微提高效率并且还会阻止插入具有非唯一索引的新文档。

所以现在我创建的LiteDB数据库集合如下所示:

        // Get the collection (or create, if doesn't exist)
        LiteCollection<YacksProjectInfo> yacksProjects = 
                                  liteDatabase.GetCollection<YacksProjectInfo>("YacksProjects");

        // Index current and future documents using ProjectName and ModuleNumber properties
        yacksProjects.EnsureIndex((YacksProjectInfo x) => x.ProjectName, true);
        yacksProjects.EnsureIndex((YacksProjectInfo x) => x.ModuleNumber, true);