Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用Mongoose向MongoDB中的数组添加元素_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 使用Mongoose向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 }] }] 本系列的基本理念是存储电视节目的详细信息。电视节目可以包含多个季节,每个季节包含多个剧

首先,让我从提供MongoDB模式开始

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”