MongoDB:使用引用作为键并手动添加值

时间:2015-04-26 14:49:01

标签: mongodb reference

我是Mongo DB的新手,有以下问题。 让我们假设我有这个文档结构,用户Joe Bloggs观看一个内容,用id 5000引用:

db.users.insert({
  forname: 'Tom',
  surname: 'Smith',
  DOB: 22081989,
  watch: [{
            media_id: 6000,
            stream_min: 35
            }]
});

db.media_content.insert({
  _id: 6000,
  content_name: 'Film XYZ', 
  durations_min: 45, 
  media_type: 'video',
});

var minutes_watched = db.users.find(
{
    "forname": "Tom", 
    "surname": "Smith", 
    "DOB": 22081989, 
    "watch.media_id": 6000
}, 
{ 
    "watch": { 
        "$elemMatch": { "media_id": 6000 } 
    } 
}).watch[0].minutes_watched;

我想补充说,用户Joe Bloggs仅观看了电影XYZ的35分钟,但是长达45分钟。如果我想证明Joe Bloggs以35分钟的时间观看了电影XYZ,我将如何添加这个以及查询会是什么样子。

--- 更新 ---

我没有进行更新,而是将其全部编码,以便我可以尝试一下:

{{1}}

我以为我得到了它,但我仍然得到了消息:

  

TypeError:无法读取属性'观看' null。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

您可以重构文档架构,使watch数组转换为具有引用ID和分钟监视属性的嵌入式文档,而不是仅具有id值的数组。像$push这样的更新应该做:

db.users.update({
        "forname": "Joe", 
        "surname": "Bloggs", 
        "DOB": 12061989, 
        "watch": 5000
    },
    {
        "$push": {
            "watch": {
                "media_id": 5000,
                "minutes_watched": 35
            }
        }
    }
);

以上更新了用户“Joe”的用户文档,以在具有上述属性的watch数组中添加嵌入文档。为了整理你可以$pull另一个watch数组元素值为5000

db.users.update({
        "forname": "Joe", 
        "surname": "Bloggs", 
        "DOB": 12061989, 
        "watch": 5000
    },
    {
        "$pull": { "watch": 5000 }
    }
);

由于您现在已经观看了实际持续时间并且用户文档中嵌入了媒体ID详细信息,因此您可以在给定媒体ID的情况下查询两个集合以获取观看的分钟数(使用$elemMatch $addToSet 1}}数组只投影那个字段)和电影细节如下:

watch

修改

如果用户再观看2部电影,其中一部用户识别为4567,总共80分钟为20分钟,另一部分为ID为1234,持续58分钟,您只需将这些详细信息推送到var minutes_watched = db.users.findOne( { "forname": "Joe", "surname": "Bloggs", "DOB": 12061989, "watch.media_id": 5000 }, { "watch": { "$elemMatch": { "media_id": 5000 } } }).watch[0].minutes_watched; var movie = db.media_content.findOne({"_id": 5000}); 即可。使用$eachCreating your own auth clients的数组如下:

watch

对用户“Joe”db.users.update({ "forname": "Joe", "surname": "Bloggs", "DOB": 12061989 }, { "$addToSet": { "watch": { $each: [ { "media_id": 4567, "minutes_watched": 20 }, { "media_id": 1234, "minutes_watched": 58 } ] } } } ); 的查询将生成更新的文档:

db.users.findOne({"forname": "Joe"})