如何遍历LiteDB.LiteCollection以获取大型litedb数据库文件中的特定键值

时间:2019-02-10 14:43:35

标签: c# litedb

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

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

/ 插入查询 /

公共无效搜索(/ *驱动器路径* /)

{

foreach(Directory.GetFiles(路径,“ ”))中的字符串文件)

{

尝试

{

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

{

var FileDBptr = db.GetCollection(“ FileDB”);

var data = new FileInfoDB(file);

FileDBptr.Insert(data);

Console.WriteLine(“成功插入”);

}

}

捕获(异常e)

{

Console.WriteLine(“无法创建数据库!!!!” + e);

}

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

{

尝试

{

Search(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;
            }
        }
    }
}

//要查询的查询代码

string fileName =“ $ 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);
                   }
                }                                          
            }

}

这是存储在精简版数据库文件中的数据格式

{

“ _ id”:{“ $ oid”:“ 5c4ebee0f2e2d05814dcf865”},

“文件名”:“ $ ICN03Z0.txt”,

“ FilePath”:“ C:\ $ Recycle.Bin \ S-1-5-21-3439349906-2439027251-2956315770-1001 \ $ ICN03Z0.txt”,

“ FileExtension”:“。txt”,

“ FileSize”:{“ $ 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”}

}

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

预先感谢!

0 个答案:

没有答案