2017-02-10 4 views
0

Я хочу, чтобы документы не удалялись в моем проекте, и я решил использовать метаданные для отметки документа как архивированного. Я использовал ниже код, чтобы сделать это:RavenDB запросы метаданных

public class DeleteDocumentListener : IDocumentDeleteListener 
{ 
    public void BeforeDelete(string key, object entityInstance, RavenJObject metadata) 
    { 
     metadata.Add("Archived", true); 
     throw new NotSupportedException(); 
    } 
} 

После этого я хотел изменить запрос, чтобы вернуть только те документы, которые Архивные значения метаданных к ложным:

using (var session = _store.OpenSession()) 
{ 
    var query = session.Advanced.DocumentQuery<Cutter>() 
       .WhereEquals("@metadata.Archived", false); 
} 

К сожалению, этот обратный запрос пустой результирующий набор. Похоже, что если у документа нет этого свойства метаданных, то выше условие считается ложным. Я не ожидал этого.

Как я могу составить запрос для возврата Документы, не имеющие свойства метаданных, или это свойство имеет какое-то значение?

ответ

3

Вы можете решить путем создания индекса для вас Cutter документов, а затем запросить против этого:

public class ArchivedIndex : AbstractIndexCreationTask<Cutter> 
{ 
    public class QueryModel 
    { 
     public bool Archived { get; set; } 
    } 

    public ArchivedIndex() 
    { 
     Map = documents => from doc in documents 
      select new QueryModel 
      { 
       Archived = MetadataFor(doc)["Archived"] != null && MetadataFor(doc).Value<bool>("Archived") 
      }; 
    } 
} 

Тогда запрос так:

using (var session = documentStore.OpenSession()) 
{ 
    var cutters = session.Query<ArchivedIndex.QueryModel, ArchivedIndex>() 
     .Where(x => x.Archived == false) 
     .OfType<Cutter>() 
     .ToList(); 
} 

Надеется, что это помогает!

+0

Это сработало очень хорошо, спасибо. Это правда, что мне нужно реализовать такой индекс для каждого объекта, который у меня есть в моем проекте? Возможно ли иметь один индекс общего назначения? –

Смежные вопросы