2015-05-09 15 views
10

Können Sie mir helfen, richtig zu laufen "Pull (remove)" mit 2.0-Treiber.MongoDB. NET-Treiber 2.0 Pull (Element entfernen)

Ich habe eine Sammlung wie diese und ich möchte den ersten Nachfolger namens Fethiye von Follower-Feld entfernen.

{ 
    "_id": ObjectId("554e05dfc90d3d4dfcaa2aea"), 
    "username": "bodrum", 
    "followerList": [ 
    { 
     "_id": ObjectId("554e0625a51586362c33c6df"), 
     "follower": "fethiye", 
     "avatar": "fethiye.png" 
    }, 
    { 
     "_id": ObjectId("554e0625a51586362c33c6df"), 
     "follower": "izmir", 
     "avatar": "izmir.png" 
    } 
    ] 
} 

Wie kann ich diese Abfrage beheben?

var filter = new BsonDocument("username", "bodrum"); 
var update = Builders<Person>.Update.Pull("followerList:follower", "fethiye"); 
Person pr = collection.FindOneAndUpdateAsync(filter, update).Result; 

Danke.

Antwort

28

Wenn Sie einen Filter verwenden, um Array-Elemente zu entfernen, müssen Sie den Builder anstelle von Pull (der mit ganzen Elementen übereinstimmt) verwenden.

var collection = db.GetCollection<Person>("people"); 
var filter = new BsonDocument("username", "bodrum"); 
var update = Builders<Person>.Update.PullFilter("followerList", 
    Builders<Follower>.Filter.Eq("follower", "fethiye")); 
var result = collection.FindOneAndUpdateAsync(filter, update).Result; 

Oder etwas kurz und bündig, mit Lambda-Ausdrücke:

var update = Builders<Person>.Update.PullFilter(p => p.followerList, 
               f => f.follower == "fethiye"); 
var result = collection 
    .FindOneAndUpdateAsync(p => p.username == "bodrum", update).Result; 
+1

Was passiert, wenn das das Dokument, das wir eine Ebene ziehen wollen war tiefer? wie in dieser Frage http://stackoverflow.com/questions/32995762/convert-mongodb-shell-query-to-c-sharp-query –

+0

Was ist "Sammlung" Variable hier, können Sie mir den Code dafür zeigen? Vielen Dank. – user734028

+1

@ user734028 Ich habe die Codezeile dafür hinzugefügt. – JohnnyHK

Verwandte Themen