Search code examples
c#mongodbmongodb.driver

How do i insert Adds many objects to the the List In c# MongoDB.Driver


How do I insert Adds many objects to the List In c# MongoDB.Driver?

my c# Entity

       /// <summary>LogTest</summary>
        public class VisitLog
        {
            /// <summary>MongoDB特有的字段</summary>
            [MongoDB.Bson.Serialization.Attributes.BsonElement("_id")]
            [JsonConverter(typeof(ObjectIdConverter))]
            public MongoDB.Bson.ObjectId MongoId { get; set; }

            /// <summary>YMD datetime</summary>
            public int Yymmdd { get; set; }

            /// <summary>Visitor</summary>
            public string Visitor { get; set; }

            /// <summary>VisitInfos</summary>
            public List<VisitInfo> VisitInfos { get; set; }

        }

In the MongoDBCode Like the code

// 1
{
    "_id": ObjectId("5f506eb02000a9b52d72a600"),
    "Yymmdd": NumberInt("20200903"),
    "Visitor": "360spider",
    "VisitInfos": [ ]
}

i will add objects to the "VisitInfos": [ ]

How do I insert Adds many objects to the List In c# MongoDB.Driver?

Way 1: insert only one object. my test code is:

 

var filter = Builders<VisitLog>.Filter.Eq("_id", item.MongoId);
var update = Builders<VisitLog>.Update.Push("VisitInfos", new VisitInfo { Visitor = Visitor, Browser = "IE", Ip = "192.168.1.1", Createtime = DateTime.Now.ToUnixTimeLocalIslong() });
var result = BB.UpdateOne(filter, update);

The Way 2: i want to insert InsertManyAsync

var items = BB.Find(x => x.Yymmdd.Equals(Yymmdd) && x.Visitor.Equals(Visitor)).Project<VisitLog>(fields).ToList();
                if (items.Count > 0)
                {
                    var item = items[0];


                    var VisitInfos = new List<VisitInfo>();

                    for (int j = 0; j < 10000; j++)
                    {
                        VisitInfos.Add(new VisitInfo { Visitor = Visitor, Browser = "IE", Ip = "192.168.1.1", Createtime = DateTime.Now.ToUnixTimeLocalIslong() });
                    }

                    var filter = Builders<VisitLog>.Filter.Eq("_id", item.MongoId);
                    var update = Builders<VisitLog>.Update.Push("VisitInfos", VisitInfos);
                    var result = BB.UpdateOne(filter, update);
  
                }

the way 2 is failed.

please help me. this very much.....


Solution

  • On the Builders<Order>.Update there's a PushEach which accepts an IEnumerable. This is equivalent to doing:

    { $push: { scores: { $each: [ 90, 92, 85 ] } } }
    

    https://docs.mongodb.com/manual/reference/operator/update/push/#append-multiple-values-to-an-array

    For simplicity here's an example of an order and order items.

    In MongoDB we'll have:

    > db.orders.find()
    { "_id" : ObjectId("5f50aef4d7d9f967d0322932"), "Items" : [ ] }
    

    Then we'll execute the following C# Code.

    var client = new MongoClient();
    var db = client.GetDatabase("test");
    var items = db.GetCollection<Order>("orders");
    
    var filter = Builders<Order>.Filter.Empty;
    var update = Builders<Order>.Update.PushEach(x => x.Items, new[]
    {
        new OrderItem{Name = "Order 1", Price = 10.1M},
        new OrderItem{Name = "Order 2", Price = 20.2M}
    });
    
    await items.UpdateOneAsync(filter, update);
    
    public class Order
    {
        public ObjectId Id { get; set; }
        
        public List<OrderItem> Items { get; set; } 
            = new List<OrderItem>();
    
    }
    
    public class OrderItem
    {
        public string Name { get; set; }
        public decimal Price { get; set; }
    }
    

    Now if we take a look at our document in MongoDB we'll have the 2 items added to our array

     db.orders.find().pretty()
    {
            "_id" : ObjectId("5f50aef4d7d9f967d0322932"),
            "Items" : [
                    {
                            "Name" : "Order 1",
                            "Price" : "10.1"
                    },
                    {
                            "Name" : "Order 2",
                            "Price" : "20.2"
                    }
            ]
    }