복붙노트

[MONGODB] MongoDB를 닷넷 드라이버 2.0 풀 (제거 요소)

MONGODB

MongoDB를 닷넷 드라이버 2.0 풀 (제거 요소)

당신이 날 2.0 드라이버가 제대로 "풀 (제거)"를 실행하는 데 도움이 될 수 있습니다.

이 같은 컬렉션을하고 난 추종자 필드에 의해 페티라는 이름으로 첫 번째 추종자를 제거합니다.

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

어떻게이 쿼리를 해결할 수 있습니까?

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

감사.

해결법

  1. ==============================

    1.배열 요소를 제거하기 위해 필터를 사용하는 경우 (전체 요소를 일치) 풀 대신 PullFilter 빌더를 사용합니다.

    배열 요소를 제거하기 위해 필터를 사용하는 경우 (전체 요소를 일치) 풀 대신 PullFilter 빌더를 사용합니다.

    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;
    

    또는 좀 더 간결하게, 람다를 사용하여 :

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

    2.당신이 컬렉션 이름 사람이 가정하면, 당신은 배열에서 레코드를 제거하기 위해 PullFilter을 사용할 수 있습니다

    당신이 컬렉션 이름 사람이 가정하면, 당신은 배열에서 레코드를 제거하기 위해 PullFilter을 사용할 수 있습니다

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

    우리는 또한 필터링 된 문서 내에서 값의 배열을 제거해야하는 경우 우리는이 라인 업데이트 빌더를 대체 할 수있다

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

    또한 많은 문서를 저장, updateOne는 updateMany로 대체 될 수 있습니다

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

    3.이것은 내가 중첩 된 배열 객체를 삭제하는 데 사용하는 것입니다

    이것은 내가 중첩 된 배열 객체를 삭제하는 데 사용하는 것입니다

    -parentpath : followerList -propertie : 추종자 - 값 : 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);
    

    예 깊은 중첩 된 배열 객체를 삭제합니다 : 이제 이름 미상으로 개체를 삭제하자

    -parentPath : followerList.0.testArray -propertie : 이름 - 값 : 미상

        {
      "_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"
        }
      ]
    } 
    
  4. ==============================

    4.수도 내가 MongoDB.Entities를 사용하여 훨씬 간단 솔루션을 제공합니다. 사람과 추종자들은 자신의 컬렉션에 저장되고 일대 다 관계를 나타내고있다.

    수도 내가 MongoDB.Entities를 사용하여 훨씬 간단 솔루션을 제공합니다. 사람과 추종자들은 자신의 컬렉션에 저장되고 일대 다 관계를 나타내고있다.

    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);
            }
        }
    }
    
  5. from https://stackoverflow.com/questions/30141958/mongodb-net-driver-2-0-pull-remove-element by cc-by-sa and MIT license