c# mongodb mongodb-.net-driver

c# - MongoDB.Net driver 2.0 Pull(eliminar elemento)



mongodb-.net-driver (4)

¿ MongoDB.Entities ofrecer una solución mucho más simple usando MongoDB.Entities ? la person y los followers se almacenan en sus propias colecciones y representan una relación de uno a muchos.

using System.Linq; using MongoDB.Entities; namespace StackOverflow { public class Person : Entity { public string Username { get; set; } public Many<Follower> FollowerList { get; set; } public Person() => this.InitOneToMany(() => FollowerList); } public class Follower : Entity { public string Name { get; set; } public string Avatar { get; set; } } class Program { static void Main(string[] args) { new DB("followers"); var person1 = new Person { Username = "bodrum"}; person1.Save(); var follower1 = new Follower { Name = "fethiye", Avatar= "fethiye.png" }; follower1.Save(); var follower2 = new Follower { Name = "izmir", Avatar = "izmir.png" }; follower2.Save(); person1.FollowerList.Add(follower1); person1.FollowerList.Add(follower2); var fathiye = person1.FollowerList.Collection() .Where(p => p.Name == "fethiye") .FirstOrDefault(); person1.FollowerList.Remove(fathiye); } } }

¿Me pueden ayudar a ejecutar correctamente "Pull (remove)" con el controlador 2.0.

Tengo una colección como esta y quiero eliminar el primer seguidor llamado fethiye por campo de seguidor.

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

¿Cómo puedo solucionar esta consulta?

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

Gracias.


Cuando use un filtro para eliminar elementos de la matriz, debe usar el constructor PullFilter lugar de Pull (que coincide con elementos completos).

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;

O algo más sucintamente, usando lambdas:

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


Esto es lo que uso para eliminar un objeto de matriz anidada

-parentpath: followerList
-propiedad: follower
fethiye.png : fethiye.png

var filter = new BsonDocument("_id", ObjectId.Parse(id)); var updateValues = Builders<object>.Update.PullFilter(parentPath, Builders<object>.Filter.Eq(propertie, value)); DatabaseCollection.FindOneAndUpdate(filter, updateValues);

Ejemplo para eliminar un objeto de matriz anidada más profundo:
Borremos el objeto con el nombre Doe

-parentPath: followerList.0.testArray
-propiedad: name
-valor: Doe

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


Suponiendo que tiene un nombre de colección Persona, puede usar PullFilter para eliminar los registros de la matriz

var filterBuilder = Builders<Person>.Filter.Eq(person => person.username, "bodrum"); var updateBuilder = Builders<Person>.Update.PullFilter(p => p.followerList, Builders<Person>.Filter.Eq(per => per.follower, "fethiye")); var updateResult = collection.UpdateOne(filterBuilder, updateBuilder); Console.WriteLine( $"MatchedCount: {updateResult.MatchedCount}, ModifiedCount: {updateResult.ModifiedCount}");

Si también necesitamos eliminar una matriz de valores dentro de un documento filtrado, podemos reemplazar el generador de actualizaciones con esta línea

var updateBuilder = Builders<Person>.Update.PullFilter(p => p.followerList, Builders<Person>.Filter.In(per => per.follower, new List<string> {"fethiye", "izmir"}));

También para guardar muchos documentos, updateOne se puede reemplazar con updateMany

var updateResult = collection.UpdateMany(filterBuilder, updateBuilder);