首页 > 解决方案 > 如何通过 LiteDB.LiteCollection 迭代大型 litedb 数据库文件中的特定键值

问题描述

我正在使用带有 C# 代码的 LiteDB 创建一个独立的数据库,用于存储每个文件的元数据,如文件大小、绝对路径、创建时间、扩展名等。我在查询和迭代 db 文件中的确切键值时遇到问题,请帮忙谢谢。

这是我的插入查询,它从目录中获取每个文件的绝对路径,并将路径作为变量传递给我的类,以设置文件元数据值并返回带有值的对象以存储在 LiteDB 中。

/插入查询/

public void Search(/* 驱动路径 */)

{

foreach(Directory.GetFiles(path, " . ") 中的字符串文件)

{

尝试

{

使用(var db = new LiteDatabase(/我的数据库文件的路径/))

{

var FileDBptr = db.GetCollection("FileDB");

var data = new FileInfoDB(file);

FileDBptr.Insert(数据);

Console.WriteLine("成功插入");

}

}

捕获(异常 e)

{

Console.WriteLine("不能创建数据库!!!!" + e);

}

} foreach(Directory.GetDirectories(path) 中的字符串 subDir)

{

尝试

{

搜索(子目录);

}

抓住

{

扔;

}

}

}

/* 类模型 */

[可序列化]

public class FileInfoDB

{


    [BsonId]
    public ObjectId FileId { get; set; }
    public string FileName { get; set; }
    public string FilePath { get; set; }
    public string FileExtension { get; set; }
    public long FileSize { get; set; }
    public DateTime FileCreateTime { get; set; }
    public DateTime FileLastAccess { get; set; }
    public DateTime FileLastWrite { get; set; }

    public FileInfoDB(string path)
    {
        if (File.Exists(path))
        {
            try
            {
                FileInfo f = new FileInfo(path);
                FileId= ObjectId.NewObjectId();
                FileName = f.Name;
                FilePath = f.FullName;
                FileCreateTime = f.CreationTime;
                FileSize = f.Length;            //Size in bytes
                FileExtension = f.Extension;
                FileLastAccess = f.LastAccessTime;
                FileLastWrite = f.LastWriteTime;

            }
            catch (Exception)
            {

                throw;
            }
        }
    }
}

//用于检索的查询代码

字符串文件名 = "$ICN03Z0.txt";

尝试 {

            using (var db = new LiteDatabase(_jsonpath))
            {   
                var FileDBptr = db.GetCollection<FileInfoDB>("FileDB");
                FileDBptr.EnsureIndex(x=>x.FileName);
                var data2 = FileDBptr.Find(Query.EQ("FileName", fileName));              
                int c = FileDBptr.Count();
                Console.WriteLine(c);                //Correct output
                if (data2 !=null)
                { 
                   foreach (var a in data2)         //Throwing an Exception 
                   {
                       Console.WriteLine(a.FileName);
                   }
                }                                          
            }

}

这是存储在 lite 数据库文件中的数据格式

{

"_id": {"$oid":"5c4ebee0f2e2d05814dcf865"},

"文件名": "$ICN03Z0.txt",

"文件路径": "C:\$Recycle.Bin\S-1-5-21-3439349906-2439027251-2956315770-1001\$ICN03Z0.txt",

"文件扩展名":".txt",

"文件大小": {"$numberLong":"114"},

"FileCreateTime": {"$date":"2019-01-16T09:04:16.0810000Z"},

"FileLastAccess": {"$date":"2019-01-16T09:04:16.0810000Z"},

"FileLastWrite": {"$date":"2019-01-16T09:04:16.0810000Z"}

}

我希望先根据文件名搜索值,然后提取同一文件的所有其他键值对数据。我尝试使用 GitHub 中提到的 LINQ 进行不同的查询,但总是抛出异常。还使用 LiteDB shell 验证了存储在 Lite 数据库中的数据,其插入格式为上述格式,但检索出现问题。

提前致谢!

标签: c#litedb

解决方案


推荐阅读