我是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。
我做错了什么?
答案 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});
即可。使用$each
和Creating 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"})