2016-11-30 2 views
0

Angenommen, dies ist, wie meine Daten aussieht:Projizieren nur Teildokumente abgestimmt zusammen mit Originaldokument Felder MongoDB C#

{ 
"_id" : ObjectId("545dad3562fa028fb48832f0"), 
"number" : "123456", 
"persons" : [ 
     { 
       "name" : "A", 
       "country" : "US" 
     }, 
     { 
       "name" : "N", 
       "country" : "Australia" 
     }, 
     { 
       "name" : "Z", 
       "country" : "US" 
     } 

] 
} 
{ 
"_id" : ObjectId("545dad3562fa028fb48832f0"), 
"number" : "123457", 
"persons" : [ 
     { 
       "name" : "Q", 
       "country" : "India" 
     }, 
     { 
       "name" : "B", 
       "country" : "Brazil" 
     }, 
     { 
       "name" : "U", 
       "country" : "UK" 
     } 

] 
} 

Ich möchte dies in C# zurückzukehren :(Alle Dokumente mit nur Teildokumente, wo Land ist US)

{ 
"_id" : ObjectId("545dad3562fa028fb48832f0"), 
"number" : "123456", 
"persons" : [ 
     { 
       "name" : "A", 
       "country" : "US" 
     }, 
     { 
       "name" : "Z", 
       "country" : "US" 
     } 

] 
} 

zur Zeit bin ich in der Lage, die Dokumente zu erhalten, die angepassten Unterlagen enthalten, sondern auch mit den nicht-relevanten Unterlagen. Abfrage, die ich versucht:

filter = Builders<BsonDocument>.Filter.Eq(c => c.number, "123456") & Builders<BsonDocument>.Filter.ElemMatch(c => c.persons, x => x.country == "US"); 
var result = client.GetDatabase(MyMongoDB).GetCollection<MyCollection>(CollectionName).Find<MyCollection>(filter); 
+0

Können Sie MongoDB 3.4 verwenden? –

Antwort

0

Sie können dies wie folgt mit aggreggation tun:

db.collection.aggregate([ 
    { 
     $match:{ 
     "persons.country":"US" 
     } 
    }, 
    { 
     $redact:{ 
     $cond:{ 
      if:{ 
       $or:[ 
        { 
        $eq:[ 
         "$country", 
         "US" 
        ] 
        }, 
        { 
        $or:"$number" 
        } 
       ] 
      }, 
      then:"$$DESCEND", 
      else:"$$PRUNE" 
     } 
     } 
    } 
]) 

dieser Wille Ausgang:

{ 
    "_id":ObjectId("545dad3562fa028fb48832f0"), 
    "number":"123456", 
    "persons":[ 
     { 
     "name":"A", 
     "country":"US" 
     }, 
     { 
     "name":"Z", 
     "country":"US" 
     } 
    ] 
} 
+0

Das funktioniert, aber ich suchte nach einem C# -Code. Trotzdem danke. –

0

Sie können so etwas wie dies versuchen.

Nutzt $filter die Dokumente halten die angepassten Unterlagen enthalten.

var match = new BsonDocument { 
    { 
     "number", 
     "123456" 
    } 
}; 

var filter = new BsonDocument { 
    { 
     "input", 
     "$persons" 
    }, { 
     "as", 
     "person" 
    }, { 
     "cond", 
     new BsonDocument { 
      { 
       "$eq", 
       new BsonArray { 
        "$$person.country", 
        "US" 
       } 
      } 
     } 
    } 
}; 

var project = new BsonDocument { 
    { 
      "_id", 
      1 
    }, 
    { 
      "number", 
      1 
    }, 
    { 
      "persons", 
      new BsonDocument { 
       { 
       "$filter", 
       filter 
       } 
      } 
    } 
}; 

var results = collection.Aggregate().Match(match).Project(project).ToList(); 
Verwandte Themen