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

140 views Asked by At

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.....

1

There are 1 answers

1
Kevin Smith On BEST ANSWER

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"
                }
        ]
}