2017-06-13 47 views
7

Chciałem użyć programu kosmosdb do przechowywania danych szeregów czasowych określonych w document-centric design. Korzystając z oficjalnego sterownika mongodb, próbowałem napisać kilka prostych instrukcji agregujących; jednak otrzymałem błędy stwierdzające, że $ unwind i $ group nie są obsługiwane. Biorąc pod uwagę, że kosmosdb był reklamowany jako zamiennik w mongodb, brakowało mi kroku lub agregacja nie jest obsługiwaną funkcją.Czy platforma Azure Cosmos DB - agregacja interfejsu API Mongo

retrieve.Aggregate().Unwind(i => i.Observations).Group(new BsonDocument { 
     {"_id", "$Observations.Success"}, 
     {"avg", new BsonDocument{ 
     {"$avg", "$Observations.Duration"} 
     }} 
    }).ToList(); 
+0

Biorąc pod uwagę, że "pod spodem" dzieje się to, że protokół transmisji z "sterownika" jest "mapowany" na określone metody CosmosDB, wówczas takie konkretne błędy wskazywałyby, że nie jest on obsługiwany. Szybki fragment "wyszukiwarki silnika" pokazuje tylko ostatnie dodatki, aby umożliwić "agregację SQL" i brak dokumentacji sugerującej, że istnieje wsparcie dla agregacji MongoDB. Więc jeśli nie zostało to ostatnio dodane, żadna dokumentacja w połączeniu z błędami wzmacniającymi sprawę nie oznaczałaby "Nie". Myślę, że konkretne błędy są tutaj konkretną rzeczą. –

+0

@NeilLunn Podejrzewam, że również. Nazywaj mnie naiwnością, ale miałem nadzieję, że zrobiłem coś złego. – Tedford

+0

@Tedford - Potok agregacji jest teraz obsługiwany. Zobacz moją pokrewną odpowiedź (wraz z linkiem do opublikowanej listy obsługiwanych funkcji). –

Odpowiedz

2

W listopadzie 2017 roku, Cosmos DB MongoDB API obsługuje teraz rurociąg agregacji, w tym wszystkich etapach rurociągu zidentyfikowanych w oryginale pytanie ($unwind, $group).

Szczegóły obsługiwanych funkcji są podane na here.

7

względu na komentarz z @neillunn i brak jakiejkolwiek dokumentacji, która ma wpływ na to, że wydaje się, że funkcje agregacji dla cosmosdb nie są obsługiwane za pośrednictwem interfejsu API Mongo. Wygląda na to, że intention ma używać składni SQL API "cosmddb Documentdb" dla agregatów.

LINQ Składnia

var client = new DocumentClient(new Uri("https://<account>.documents.azure.com"),<password>); 

    // issue query 
    var documentUri = UriFactory.CreateDocumentCollectionUri("Prod", "retrieve"); 
    var date = "20161011".Dump("Date"); 


    var max = client.CreateDocumentQuery<ObservationDocument>(documentUri) 
      .Where(i => i.Id == date) 
      .SelectMany(i => i.observations) 
      .Max(i => i.Duration); 

składni SQL

// explicit query 
var spec = new SqlQuerySpec("select value count(o.duration) from days d join o in d.observations where d._id = @id"); 
spec.Parameters = new Microsoft.Azure.Documents.SqlParameterCollection(); 
spec.Parameters.Add(new Microsoft.Azure.Documents.SqlParameter("@id", "20161010")); 
client.CreateDocumentQuery(UriFactory.CreateDocumentCollectionUri("Prod", "retrieve"), spec).Dump("As query");