c# - 如何在 MongoDB C# 中将多个文档中的多个字段合二为一
问题描述
我想为我的应用添加社交功能。每个用户都可以向其他用户发送邀请,一旦其他用户批准了邀请,他们就是“朋友”。批准邀请的操作包括几个动作:
- 在其他用户朋友列表中添加每个 userId
- 删除发送邀请的用户的邀请
- 移除收到邀请的用户的批准邀请
我想将所有这些操作作为一个原子操作来完成。
目前,我正在这样做:
public class FriendsData
{
public long _id;//UserId
public long[] FriendsId;
public long[] SentInvitations;
public long[] AwaitingForApprovalInvitations;
}
public void ApproveInvitation(FriendsData userData, FriendsData friendData)
{
m_friends.FindOneAndUpdate(string.Format("{{_id: {0}}} ", userData._id), Builders<FriendsData>.Update.AddToSet("FriendsId", friendData._id)
.Pull("ActiveSentInvitations", friendData._id));
m_friends.FindOneAndUpdate(string.Format("{{_id: {0}}} ", friendData._id), Builders<FriendsData>.Update.AddToSet("FriendsId", userData._id)
.Pull("AwaitingForApprovalInvitations", userData._id));
}
有一个更好的方法吗?我担心数据库会在两个更新操作之间发生变化。
解决方案
推荐阅读
- kubernetes - 如何修复“不同步入口默认/测试应用程序,因为它不包含必要的注释”
- c++ - 将 double 打印到 std::cout 会导致分段错误 (C++)
- node.js - 读取 node.js 中的文件,同时打开它以供其他软件写入
- java - 我们可以在 Emulator 上执行 VTS 测试框架吗?
- flutter - 如何在表单级别(而不是字段级别)执行表单验证?
- java - Realm.copyFromRealm 导致来自错误线程的领域访问。是否可以?
- ms-access - 根据另一个表单上的组合框选择填充一个表单上的文本框
- vb.net - IIS 阻止我的请求。无法创建 SSL/TLS 安全通道
- android-studio - 为什么在调试模式下启动应用程序时,这款平板电脑的屏幕一直黑屏?
- c - K&R 使用 gdb 调试时,echo 程序的解释令人困惑。怎么了?