Node.js 使用Mongoose向MongoDB中的数组添加元素
首先,让我从提供MongoDB模式开始Node.js 使用Mongoose向MongoDB中的数组添加元素,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,首先,让我从提供MongoDB模式开始 showTitle: String, seasons: [{ seasonNumber: String, episodes: [{ episodeNumber: String, episodeTitle: String, episodeSynopsis: String }] }] 本系列的基本理念是存储电视节目的详细信息。电视节目可以包含多个季节,每个季节包含多个剧
showTitle: String,
seasons: [{
seasonNumber: String,
episodes: [{
episodeNumber: String,
episodeTitle: String,
episodeSynopsis: String
}]
}]
本系列的基本理念是存储电视节目的详细信息。电视节目可以包含多个季节,每个季节包含多个剧集
我允许用户在客户端添加额外的季节(仅季节编号)。这将向服务器端传递一个值。这部分工作正常,因为我可以在服务器端查看值,这是一个字符串
在这里,我的API调用这个特定函数
function saveReport(err, res, count, seasonId, seasonDetails)
{
if(count == 0) //if 0 means not exist, so can add into DB
{
Show.update({_id: seasonId},{$push: {seasons:{seasonNumber: [seasonDetails]}}}, {upsert:true}, function(err, result)
{
console.log(result);
res.json(result);
});
}
else
{
res.json("TV Season already exists in MongoDB");
}
}
module.exports.seasonsCreate = function(req, res)
{
console.log("Calling the seasonsCreate function");
var seasonId = req.params.id;
var seasonDetails = req.body.season; //season number as a string(intended)
//finding a specific showing using the id passed as parameter
//$elemMatch is used to check if season number exists
//using count to determine
Show.findOne({_id: req.params.id, seasons: {$elemMatch: {seasonNumber: req.body.season}}}).count(function(err, count)
{
saveReport(err, res, count, seasonId, seasonDetails);
});
}
我手动(使用MongoDB命令)在MongoDB中添加了两个季节。第1季和第2季各2集。然而,当我试图通过客户端添加第三集时,什么都没有发生。返回的确切结果如下:
对象{ok:0,n:0,nModified:0}
在使用类似方法之前,我已经完成了更新。但是,我有点不高兴,因为这次我使用了嵌套数组,而不仅仅是对象。我还尝试了几种组合:
- 有/无推力
- 带/不带套件
- 有/无插入
p/s:我使用的是最新版本的猫鼬。因为我感觉到人们发出了危险的坏建议,告诉你要
。查找()
数据,然后。保存()
我将解释“展平”数据的基本情况,以避免嵌套数组问题
嵌套数组遇到了一个问题,您需要使用它来匹配要更新的所需数组元素的索引,但它只能引用“外部”数组元素。虽然识别该元素并“推送”到该元素的内部数组可能很好,但如果要更新该内部元素,就不可能获取该内部元素的位置
因此,这里的想法是“不嵌套数组”,并对其进行结构调整,以便您能够在可用的约束条件下有效地进行更新
更好的结构是:
showttitle:String,
剧集:[{
编号:String,
情节编号:字符串,
书名:弦,
幕合综合征:弦
}]
现在,您并没有真正失去任何东西,它只是一点额外的数据复制,但成本很低
要添加到阵列,请执行以下操作:
Show.update({“\u id”:showId},{“$push”:{“剧集”:eposodedata},回调)
要更新元素,请执行以下操作:
Show.update(
{
“_id”:showId,
“情节”:{
“$elemMatch”:{
“季节编号”:季节,
“情节编号”:一集
}
}
},
{“$set”:{“剧集.$”:eposodedata},
回拨
)
甚至:
Show.update(
{
“_id”:showId,
“情节”:{
“$elemMatch”:{
“季节编号”:季节,
“情节编号”:一集
}
}
},
{“$set”:{“剧集$.情节综合征”:synopis},
回拨
)
如果你只是想要一季的所有剧集:
Show.aggregate(
[
{“$match”:{“_id”:showId,“epsisodes.季节号”:季节号},
{“$redact”:{
“如果”:{
“$eq”:[
{“$IfNull”:[“$SECTIONNUMBER”,SECTIONNUMBER]},
季节数
]
},
“然后”:“$DOWNSE”,
“else”:“$PRUNE”
}}
],
回拨
)
这将在查询中返回数组时从数组中剔除任何不匹配的项
因此,您可以做任何您想做的事情,而无需在更改数据存储时大惊小怪,也可以进行原子更新,因为原子更新不会在其他操作中将数据更改为意外状态时遇到问题,否则您将面临风险。因为我感觉到人们发出了危险的坏建议,告诉您要
。find()
然后保存数据.save()
我将解释“展平”数据以避免嵌套数组问题的基本情况
嵌套数组遇到了一个问题,您需要使用它来匹配要更新的所需数组元素的索引,但它只能引用“外部”数组元素。虽然识别该元素并“推送”到该元素的内部数组可能很好,但如果要更新该内部元素,就不可能获取该内部元素的位置
因此,这里的想法是“不嵌套数组”,并对其进行结构调整,以便您能够在可用的约束条件下有效地进行更新
更好的结构是:
showttitle:String,
剧集:[{
编号:String,
情节编号:字符串,
书名:弦,
幕合综合征:弦
}]
现在,您并没有真正失去任何东西,它只是一点额外的数据复制,但成本很低
要添加到阵列,请执行以下操作:
Show.update({“\u id”:showId},{“$push”:{“剧集”:eposodedata},回调)
要更新元素,请执行以下操作:
Show.update(
{
“_id”:showId,
“情节”:{
“$elemMatch”:{
“季节编号”:季节,
“情节编号”:一集
}
}
},
{“$set”:{“剧集.$”:eposodedata},
回拨
)
甚至:
Show.update(
{
“_id”:showId,
“情节”:{
“$elemMatch”:{
“季节编号”:季节,
“情节编号”:一集
}
}
},
{“$set”:{“剧集$.情节综合征”:synopis},
回拨
)
如果你只是想要一季的所有剧集:
Show.aggregate(
[
{“$match”:{“_id”:showId,“epsisodes.季节号”:季节号},
{“$redact”:{
“如果”:{
“$eq”:[
{“$IfNull”:[“$seasennum”