1

我正在尝试在用户的文档中缓存来自社交媒体的朋友,并且在存储/取回他们时遇到问题。首先,我盲目地剥离了他们的朋友缓存,并用我新获取的数据填充它,但通过它我发现嵌入的文档在所有用户中必须是唯一的(我有几个相同的朋友在我的测试帐户中,我得到:

{"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]
};
4

1 回答 1

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'}]
};
于 2012-12-19T14:51:48.053 回答