场景
我在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运算符对数据库进行两次调用以实现我想要做的事情。
答案 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
}
)