2016-05-09 3 views
0

Недавно я начал использовать MongoDB в качестве источника в SSIS (используя драйвер C#). Я очень новичок в MongoDB и C#. Когда у меня не было вложенных документов, заявления, как ниже работал для меня:

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); 

Теперь я получил вложенные документы. Я был в состоянии создать Java-скрипт, и он работает с самого MongoDB

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") } } ] } 
        ] } 
}]) 

В C#, как я понимаю, я должен использовать агрегат вместо найти, но я не могу перевести этот код на C#. У меня все еще есть критерии отбора и расслабляются.

Не могли бы вы помочь?

ответ

0

потому что нет шаблона для коллекции, я прикрепляю фрагмент, похожий на то, что вы искали бы. это помогает?

 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

Я надеюсь. Попробуем этот подход, спасибо. Речь идет о синтаксисе MongoCursor . MongoCursor toReturn = коллекция.?; – ICHV

+0

Хорошо, если вы хотите, чтобы курсор на агрегации, вам нужно aggregateargs или передать aggregateoptions в aggregate consturctor. или отредактированный ответ выше. Вы не можете вытащить MongoCursor. вы можете получить IAsyncCursor вместо этого, как этот var aggCursor = grades.Aggregate() .Unwind (x => x ["Items"]) .Match (filter) .ToCursor(); – KaSh

+0

Посмотрите эту ссылку для получения более подробной информации о asynccursor http://stackoverflow.com/questions/29682371/how-is-an-iasynccursor-used-for-iteration-with-the-mongodb-c-sharp-driver? RQ = 1 – KaSh

0

я получил помощь и обмен решение:

//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(); 
Смежные вопросы