我正在尝试在用户的文档中缓存社交媒体中的朋友,并且在存储/获取它们时遇到问题。 首先,我盲目地剥离了他们的朋友缓存,并且只是用我新鲜的数据填充它,但通过我发现嵌入的文档必须在所有用户中是唯一的(我有几个朋友是相同的在我的测试帐户中,我得到:
{"name":"MongoError","err":"E11000 duplicate key error index: test-dev.users.$friends.outsideID_1 dup key: { : \"1205314313242\" }","code":11001,"n":0,"connectionId":274,"ok":1}
所以我知道,因为嵌入式文档存在于我已经注册和更新的其他帐户中,所以无法创建该文档(outsideID是索引,因为我打算稍后使用它进行搜索)) 所以我开始尝试OutsideFriend.find({'outsideID':{$ in:friendsIDs}}(其中friendsIDs是我从SM查询得到的ID的数组)等等。然后在回调中我经历了并尝试添加新朋友,只是将现有文档添加到相关用户,以便它不会尝试在系统中复制它。但是,无论出于何种原因,OutsideFrind.find()永远不会返回任何文档......这让我觉得嵌入式文档不是集中的......但是为什么第一次尝试会失败?
我该怎么做? (如下图所示,如果您需要任何其他信息,请告诉我们!)
当前架构:
//External friend model
var OutsideFriend = new Schema({
outsideID:{type:String, index:true, unique:true}
,username:String
,location:String
,avatarURL:String
});
//User model
var User = new Schema({
avatarURL:String
,mySMID:String
//Social Media info
,smID:{type:String, index:true, unique:true}
,tok:String
,tokSec:String
,friends:[OutsideFriend]
};
答案 0 :(得分:1)
您的问题中有很多内容,但如果您想独立于OutsideFriend
查询User
,则不应将其嵌入User
模型中。相反,只需存储ObjectId
个朋友的引用,然后User
存储User
,当您需要完整的详细信息时。除非您发现需要,否则不要过早优化嵌入式副本,因为这会引入一致性挑战。
因此,您的var User = new Schema({
avatarURL:String
//Social Media info
,smID:{type:String, index:true, unique:true}
,tok:String
,tokSec:String
,friends:[{type: ObjectId, ref: 'OutsideFriend'}]
};
模型将更改为:
{{1}}