2016-05-09 6 views
0

Ich habe vor kurzem MongoDB als Quelle in SSIS (mit C# -Treiber) verwendet. Ich bin sehr neu mit MongoDB und C#. Wenn ich nicht verschachtelte Dokumente hatte, Aussagen wie unten für mich gearbeitet:

var query = Query.And(Query.Or(Query.GT("CreatedOn",maxUpdatedOnBSON), Query.GT("UpdatedOn", maxUpdatedOnBSON)), 
      Query.Or(Query.LT("CreatedOn", cutoffDate), Query.LT("UpdatedOn", cutoffDate)),Query.In("TestType", testTypes)); 

    MongoCursor<BsonDocument> toReturn = collection.Find(query); 

Nun, ich verschachtelte Dokumente wurde. Ich konnte Java-Skript erstellen, und es funktioniert mit MongoDB selbst

db.Test.aggregate([ 
{ $unwind : { path: "$Items",includeArrayIndex: "arrayIndex"} } , 
{ $match: { $and: [ 
     {$or: [ { CreatedOn: { $gt: ISODate("2015-11-22T00:00:00Z")} }, {UpdatedOn: { $gt: ISODate("2015-11-22T00:00:00Z") } } ] }, 
     {$or: [ { CreatedOn: { $lt: ISODate("2016-05-09T00:00:00Z")} }, {UpdatedOn: { $lt: ISODate("2016-05-09T00:00:00Z") } } ] } 
        ] } 
}]) 

In C#, wie ich sie verstehe, ich habe Aggregat verwenden statt finden, aber ich kann diesen Code in C# nicht übersetzen. Ich habe immer noch Auswahlkriterien und entspannen.

Können Sie bitte helfen?

Antwort

0

Da keine Sammelvorlage vorhanden ist, füge ich ein Snippet an, das dem ähnelt, nach dem Sie suchen würden. Hilft das?

 var builder = Builders<BsonDocument>.Filter; 
     //and operator can be used similar to below by using operator "&" or builder.And. 

     var filter = builder.Eq("state", "nj") | builder.Eq("state", "CO"); 
     var filter2 = builder.Eq("pop", 6033) | builder.Eq("city", "nyc"); 
     filter = builder.And(filter, filter2); 
     var pipeline = grades.Aggregate() 
      .Unwind(x => x["Items"]) 
      .Match(filter); 


     var list = pipeline.ToList(); 

     foreach (var item in list) 
     { 
      //do something 
     } 
+0

Ich hoffe es. Werde diesen Ansatz versuchen, danke. Die Frage bezieht sich auf die MongoCursor -Syntax. MongoCursor toReturn = Sammlung.?; – ICHV

+0

Nun, wenn Sie einen Cursor auf Aggregation wollen, müssen Sie aggregargars oder aggregateoptions aggregate consturctor übergeben. oder bearbeitete Antwort oben. Man kann MongoCursor nicht herausholen. Sie können stattdessen IAsyncCursor abrufen. var aggCursor = grades.Aggregate() .Unwind (x => x ["Elemente"]) .Match (filter) .ToCursor(); – KaSh

+0

Werfen Sie einen Blick auf diesen Link für detaillierte Informationen über asynccursor http://stackoverflow.com/questions/29682371/how-is-aniasynccursor-used-for-iteration-with-the-mongodb-c-sharp-driver? rq = 1 – KaSh

0

bekam ich Hilfe und teilen die Lösung:

//Create matching criteria used in the aggregation pipeline to bring back only the specified documents based on date range 

    var match = new BsonDocument("$match", 
      new BsonDocument("$and", 
       new BsonArray() 
       .Add(new BsonDocument("$or", new BsonArray().Add(new BsonDocument("CreatedOn", new BsonDocument("$gt", maxUpdatedOnBSON))).Add(new BsonDocument("UpdatedOn", new BsonDocument("$gt", maxUpdatedOnBSON))))) 
       .Add(new BsonDocument("$or", new BsonArray().Add(new BsonDocument("CreatedOn", new BsonDocument("$lt", cutoffDate))).Add(new BsonDocument("UpdatedOn", new BsonDocument("$lt", cutoffDate))))))); 

    //create the arguments to pass to the $unwind method of the aggregation 
    var unwindargs = new BsonDocument("path", "$LineItems"); 
    unwindargs.Add("includeArrayIndex", "arrayIndex"); 

    //create the unwind stage and add the arguments 
    var unwind = new BsonDocument("$unwind", unwindargs); 

    //create a new pipeline and gather the results 
    var pipeline = new[] { match, unwind }; 
    var mongoArgs = new AggregateArgs { Pipeline = pipeline }; 

    var toReturn = collection.Aggregate(mongoArgs).ToList();