更新mongo文档整体或特定字段

时间:2019-06-21 12:10:19

标签: c# mongodb mongodb-.net-driver

场景

我在mongodb中有一个会话文档,我必须将消息添加到message数组中并更新最后发送的日期,请参见下面的架构。

{ 
"_id" : NumberInt(5), 
"CurrentOwnerId" : NumberInt(9), 
"LastSent" : ISODate("2019-06-21T11:57:32.861+0000"), 
"Messages" : [
    {
        "_id" : BinData(3, "nuC1iYTKtkGzSuv7pVHsKg=="), 
        "MessageContent" : "Hi There", 
        "Status" : "Pending", 
        "DateSent" : ISODate("2019-06-21T11:57:32.861+0000"), 
        "Method" : "Slack"
    }
 ]
}

我的问题

简单地读取整个文档(使用BsonId)并通过c#整体更新文档,即将我的消息推送到数组并设置最后发送的日期,然后更新使用驱动程序将文档作为一个整体,或者使用$ set和$ push运算符对数据库进行两次调用以实现我想要做的事情。

3 个答案:

答案 0 :(得分:1)

我认为您不需要拨打2个电话,因为MongoDB update命令可以接受多个更新指令。 示例:

db.collection.update({_id: docId}, {$push: {values: dboVital}, $set: {endTime: time}});

因此,您可以将消息添加到您的数组中,并只需一个调用即可更新lastSentDay。

答案 1 :(得分:1)

正如Eduardo Hitek所说,您可以在单个查询中设置多个属性。 因此,您可以更新实体,而不必像这样先实际从数据库中检索它:

    //Build an Id Filter
    var idFilter = Builders<Chat>.Filter.Eq(x => x.Id, "1");


    var message = new Message() { MessageContent = "Hey!", Method = "Slack" };

    //Build an update definition to add the message
    var addMessage = Builders<Chat>.Update.AddToSet(x => x.Messages, message);
    //Build an update definition to set the LastSent property
    var setLastSent = Builders<Chat>.Update.Set(x => x.LastSent, DateTime.Now);
    //Combine both update definitions
    var combinedUpdate = Builders<Chat>.Update.Combine(addMessage, setLastSent);

    //Execute the query.
    db.GetCollection<Chat>("ChatCollection").UpdateOne(idFilter, combinedUpdate);

像这样更新实体的另一个好处是,它是原子完成的。

答案 2 :(得分:0)

像其他答案一样,

可以通过$ push或$ addToSet在单个mongodb命令中完成。这是使用我的库MongoDB.Entities

以便捷且强类型化的方式进行操作的方法
using MongoDB.Entities;
using System;

namespace StackOverflow
{
    public class Program
    {
        public class Conversation : Entity
        {
            public DateTime LastSent { get; set; }
            public Message[] Messages { get; set; }
        }

        public class Message
        {
            public string Content { get; set; }
        }

        private static void Main(string[] args)
        {
            new DB("test");

            var convo = new Conversation
            {
                LastSent = DateTime.Now.AddMinutes(-10),
                Messages = new[] { new Message { Content = "This is the first message..." } }
            };
            convo.Save();

            var msg = new Message { Content = "This is a new message..." };

            DB.Update<Conversation>()
              .Match(c => c.ID == convo.ID)
              .Modify(c => c.LastSent, DateTime.Now)
              .Modify(b => b.Push(c => c.Messages, msg))
              .Execute();
        }
    }
}

以下更新命令发送到数据库:

db.Conversation.update(
    {
        "_id": ObjectId("5d0ce23647e2d210903b3930")
    },
    {
        "$set": {
            "LastSent": ISODate("2019-06-21T13:57:10.998Z")
        },
        "$push": {
            "Messages": {
                "Content": "This is a new message..."
            }
        }
    },
    {
        "multi": true,
        "upsert": false
    }
)