从Mongoose获取现有的嵌入式文档

时间:2012-12-19 06:58:20

标签: javascript mongodb mongoose

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

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

1 个答案:

答案 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}}