2016-04-11 7 views
0

Hallo, ich versuche, meine Dokumente in einem Array mit LINQ zu zählen.Anzahl eingebetteter Dokumente mongodb C# LINQ

Meine Struktur ist einfach. Hier ist ein vereinfachtes Bson-Beispiel.

{ 
"_id" : ObjectId("56fa945dbf0c37096048109f"), 
"Commands" : [ 
    { 

     "CommandId" : ObjectId("56fbdc24bf0c372078f10227"), 
    }, 
    { 
     "CommandId" : ObjectId("56fbdc28bf0c372078f1022b"),  
    }, 
    { 
     "CommandId" : ObjectId("570b6863bf0c370838473321"), 
    } 
] 

}

Dies ist, was ich mit so weit gekommen sind, aber es sagt nur i1 Befehl haben.

var result = 
        (from e in collection.AsQueryable<Sequence>() 
        where e._id == seqid 
        select e.Commands).Count();    
       Console.WriteLine("There where " + result + " Commands"); 

Irgendwelche Ideen?

+0

Es war ein wh Seit ich MongoDB benutzt habe, sieht es so aus, als würdest du die Anzahl der Commands Objekte zählen, was in diesem Fall tatsächlich nur 1 Item ist. Sie müssen den Inhalt des Commands-Objekts aufzählen. – Alex

Antwort

1

Ich würde empfehlen, die Aggregation Rahmen und $ Größe für diese Verwendung - das das Array selbst an den Client übertragen wird vermieden.

Zum Beispiel:

var result = collection.Aggregate().Match(x => x.Id == seqid) 
    .Project(new BsonDocument("count", new BsonDocument("$size", "$Commands"))) 
    .FirstOrDefault() 
    .GetValue("count").ToInt32(); 

Console.WriteLine("There were " + result + " Commands"); 

Sie können hier mehr über $ Größe lesen: https://docs.mongodb.org/manual/reference/operator/aggregation/size/

+0

Ich wusste nichts davon. Sieht gut aus und funktioniert Danke Kevin! – Jacob

0

Ich schaffte es, eine Lösung zu finden, nicht sicher, ob es das beste ist, aber es funktioniert.

  var result = (from p in collection.AsQueryable().Where(p => p._id == seqid) 
       from cmds in p.Commands 
       select cmds).Count(); 
      Console.WriteLine("There where " + result + " Commands"); 
0

LINQ-Abfragen werden immer übersetzt Aggregation Rahmen Pipelines

> var pipeline = [ 
... { "$group" : { "_id" : 1, "__result" : { "$sum" : 1 } } } 
... ] 
> db.test.aggregate(pipeline) 

Verwenden Sie einfache Methode Count mit Filterung

Verwandte Themen