查找Lotus Notes数据库中的所有文档

本文关键字:文档 Lotus Notes 数据库 查找 | 更新日期: 2023-09-27 18:14:22

我正在开发一个c#应用程序,它从Lotus Notes数据库()中的所有文档中提取元数据。nsf文件,没有Domino服务器)因此:

NotesDocumentCollection documents = _notesDatabase.AllDocuments;
if (documents.Count>0)
{
      NotesDocument document = documents.GetFirstDocument();
      while (document!=null)
      { 
           //processing 
      } 
}

这工作得很好,除了我们还需要记录文档出现的所有视图。我们像这样遍历所有的视图:

foreach (var viewName in _notesDatabase.Views)
{
        NotesView view = _notesDatabase.GetView(viewName);
        if (view != null)
        {
            if (view.AllEntries.Count > 0)
            {
                folderCount = view.AllEntries.Count;
                NotesDocument document = view.GetFirstDocument();
                while (document!=null)
                {
                    //record the document/view cross reference
                    document = view.GetNextDocument(document);
                }
            }
            Marshal.ReleaseComObject(view);
            view = null;
        }
}

以下是我的问题和疑问:

  1. 我们经常在视图中遇到NotesDatabase中找不到的文档。AllDocuments集合。这怎么可能呢?有没有更好的方法把所有的文档都放到笔记数据库中?

  2. 有没有一种方法来找出所有的视图一个文档是在没有循环通过所有的视图和文档?这部分过程可能非常缓慢,特别是对于大型nsf文件(35 GB!)。我想找到一种方法来获得视图名称和Document.UniversalID的列表。

  3. 如果没有更有效的方法来查找所有文档+视图信息,是否有可能并行执行此操作,使用单独的线程/工作器/任何处理每个视图?

谢谢!

查找Lotus Notes数据库中的所有文档

按相同顺序回答问题:

  1. 我不确定这是如何可能的,除非也许有一个特殊类型的文档,没有得到那个AllDocuments属性返回。也许复制冲突被排除了?

  2. 不幸的是,没有更好的方法。视图实际上只是保存到数据库中的查询,它返回匹配文档的列表。没有与文档直接关联的视图列表

  3. 您可以通过在自己的线程上处理每个视图来并行地执行此操作,但是瓶颈可能是需要刷新视图的Domino服务器,因此它可能不会获得太多好处。

另一个注意事项,视图中的"AllEntries"不同于视图中的所有文档。条目可以包括类别行之类的内容,类别行只是一个分组,不受实际文档的支持。换句话说,AllEntries的计数可能大于所有文档的计数。

首先,可能在作业运行时正在创建文档。循环遍历AllDocuments需要时间,然后循环遍历所有视图也需要时间。除非您正在处理与所有其他可能的用户隔离的数据库的副本或副本,否则您很容易遇到这样的情况:在加载AllDocuments之后,但在访问其中一个视图之前创建了文档。

另外,view.getXXXDocument()方法返回的一些对象可能是已删除的文档。您可能应该检查document.isValid()以避免尝试处理它们。

我建议使用NotesNoteCollection作为对AllDocuments的检查。如果AllDocuments返回完整的文档集,或者如果NotesNoteCollection返回完整的文档集(在选择文档并构建集合之后),那么有一种比迭代每个视图更快的方法可以做到这一点。

(1)从视图中读取所有选择公式,删除单词'SELECT'并将它们保存在{view name, formula}对的列表中。

(2)遍历文档(来自NotesNoteCollection或AllDocuments),对于每个文档,您可以使用foreach遍历视图/公式对列表。在每个公式上使用NotesSession.Evaluate方法,为上下文传递当前文档。任何求值公式的返回值为True都会告诉您文档位于与公式对应的视图中。

这仍然是蛮力,但它比遍历所有视图要快。