1

ソーシャルメディアの友達をユーザーのドキュメントにキャッシュしようとしていますが、保存/復元に問題があります。最初に、友達のキャッシュをやみくもに取り除き、データの新しいフェッチで埋めるだけでしたが、それを通して、埋め込まれたドキュメントはすべてのユーザー間で一意である必要があることがわかりました(同じ友達が2人います私のテストアカウントでは、次のようになります。

{"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保存し、完全な詳細が必要なときにそれを入力します。一貫性の問題が発生するため、必要がない限り、埋め込みコピーで時期尚早に最適化しないでください。ObjectIdUser

したがって、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 に答える