2017-05-09 1 views
0

Ich arbeite auf Couchbase Lite WPF-Projekt. Ich möchte Termine nach Datum bekommen. Also habe ich eine Ansicht mit folgendem Code erstellt.So verwenden Sie Abfrage in Couchbase lite

appointments.AddRange(App.StorageRepository.Query<AppointmentModel>(map, limit, offset, TodayWhere)); 



bool TodayWhere(IDictionary<string, object> accessDoc, IDictionary<string, object> parameters) 
      { 
       var tableName = parameters["table"].ToString(); 
       if (!accessDoc["_id"].ToString().Contains(tableName)) 
       { 
        return false; 
       } 
       var startDay = Convert.ToDateTime(accessDoc["startDate"].ToString()); 
       var today = Convert.ToDateTime(parameters["today"].ToString()); 
       if (startDay.Date != today.Date) 
       { 
        return false; 
       } 
       return true; 
      } 

public List<T> Query<T>(IDictionary<string, object> map, int limit, int offset, Func<IDictionary<string, object>, IDictionary<string, object>, bool> monitoring) 
     { 
      List<T> list = new List<T>(); 
      var viewName = map["view"].ToString(); 
      var view = Manager.SharedInstance.GetDatabase(DatabaseName).GetView(viewName); 
      view.SetMap((doc, emit) => 
       { 
        if (!monitoring(doc, map)) 
        { 
         return; 
        } 
        emit(doc, null); 
       }, "1.0"); 

      var query = view.CreateQuery(); 
      query.Limit = limit; 
      query.Descending = true; 
      var queryResult = 
       query 
       .Run() 
       .ToList(); 
      foreach (var item in queryResult) 
      { 
       var doc = GetObject<T>(item.Document.UserProperties); 
       list.Add(doc); 
      } 
      return list; 
     } 

So funktioniert dieser Code, aber es gibt ein Problem. Zum Beispiel. Ich habe die Ansicht in 2016.05.06 erstellt. Die Ansicht gibt die Termine des Tages korrekt zurück. Aber es gibt dieselben Daten auch heute wieder. Ich bin mir nicht sicher, was falsch ist. Ich bin verwirrt über Ansicht und Abfrage. Ich kann die Ansicht nicht wie SQL-View-Tabelle verwenden?

Antwort

1

Ansichten erstellen einen statischen Index, der persistent ist. Die Kartenfunktion für eine Ansicht muss eine reine Funktion sein, was bedeutet, dass sie von nichts anderem als dem übergebenen Dokument abhängen kann. Wenn Ihre Kartenfunktion auf irgendetwas angewiesen ist (wie das aktuelle Datum), erhalten Sie inkonsistente Ergebnisse. Es sieht so aus, als ob das in deinem Fall passiert. Kartenfunktionen

Regeln für Couchbase Lite Ausblick:

  • Es muss eine „reine“ Funktion sein: Das heißt, jederzeit mit dem gleichen Eingang genannt wird, muss sie produzieren genau die gleiche Leistung. Mit anderen Worten, es kann keinen externen Zustand verwenden, nur seine Eingabe JSON.
  • Es kann keine Nebenwirkungen haben: Es sollte keinen externen Zustand ändern, weil es unvorhersehbar ist, wenn es aufgerufen wird oder wie oft es aufgerufen wird oder in welcher Reihenfolge Dokumente an es übergeben werden.
  • Es muss Thread-sicher sein: Es kann auf einem Hintergrund-Thread des Indexers oder sogar parallel auf mehreren Threads auf einmal aufgerufen werden.

Siehe Dokumentation unter Couchbase Lite Views.

+1

Hallo Hod, Danke für Ihre Antwort. Dann wie kann ich eine Abfrage wie die Logik machen. Wenn Sie einen Beispielcode haben, bitte senden Sie mir. – Meteoric

+0

Ich kann das nicht wirklich auf Stack Overflow tun (es passt nicht zu den Buchungsrichtlinien). Ich schlage vor, die Couchbase Foren (https://forums.couchbase.com/t/how-to-use-query/12757/2) zu verfolgen. – Hod

Verwandte Themen