gpt4 book ai didi

MongoDB更新子文档数组或字典

转载 作者:可可西里 更新时间:2023-11-01 10:44:30 24 4
gpt4 key购买 nike

我正在尝试确定以下哪种模式对于使用 mongodb 实现最有效。我需要跟踪系统中每个用户的好友 ID 和共同好友计数(user_id 在整个集合中是唯一的)。好友数量可达10万。

模式 1

{
“_id” : “…”,
“user_id” : “1”,
friends : {
“2” : {
“id” : “2”,
“mutuals” : 3
}
“3” : {
“id” : “3”,
“mutuals”: “1”
}

“4” : {
“id” : “4”,
“mutuals”: “5”
}
}

模式 2

{
“_id” : “…”,
“user_id” : “1”,
friends : [
{
“id” : “2”,
“mutuals” : 3
},
{
“id” : “3”,
“mutuals”: 1
},
{
“id” : “4”,
“mutuals”: 5
}
]

要求:

  1. 给定一个 user_id 和 friend id 更新文档,如果 friend ​​id 存在则互加 1,否则添加互为 1 的新 friend
  2. 给定 user_id 和 friend id 更新文档,如果 friend 存在且相互计数 > 1,则将相互计数减 1,否则从文档中删除 friend
  3. 有了 ID 列表,在文档中查找以确定存在哪些 friend ID(我知道这可以在客户端完成,但我对服务器端解决方案感兴趣)
  4. 应该使用哪些索引来加速上述操作?

在我正在进行的工作中,我已经使用模式 1 实现了其中的大部分内容,但现在我开始意识到它可能不如模式 2 适合。但是,我无法找到解决上述问题的最有效方法。

最佳答案

据我所知,第 1 点和第 2 点不能在 mongoDB 的单个语句中完成。您可能需要查询 mongodb 以检查特定的 user_id、friend.id 组合是否存在。如果确实如此,则更新其他添加到 friend 数组。引用下面的 JavaSscript 代码:

    use <dbname>;
var FriendsList;
var FriendId = "9";
var UserId = "1";
var Friends = db.Friends.findOne({"user_id":UserId, "friends.id":FriendId});
if (Friends != null){
print ("Friends is not null");
FriendsList = Friends.friends;
// print (FriendsList.toSource());
for (var i = 0; i < FriendsList.length; i++){
var curFriend = FriendsList[i];
if (curFriend["id"] == FriendId){
curFriend["mutuals"] = curFriend["mutuals"] + 1;
FriendsList[i] = curFriend;
break;
}
}
}
if (Friends == null){
print ("Friends is null");
Friends = db.Friends.findOne({"user_id":UserId});
FriendsList = Friends.friends;
FriendsList.push({"id":FriendId, "mutuals":1});
// print (FriendsList.toSource());
}
Friends.friends = FriendsList;
db.Friends.save(Friends);

如果您找到更好的方法,请分享。

关于MongoDB更新子文档数组或字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13619753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com