Mongoose,如何在现有的JSON文档中将元素追加到数组中

时间:2018-03-02 22:47:01

标签: node.js mongodb mongoose

情况

我有一个具有以下数据结构的MongoDB

teamName: (String)
data: (Array)
---date: (Timestamp)
---userResults: (Object)
------userHash: (StringHash)
------score: (String)
------comment: (String)

Here is a short example on PasteBin

问题

鉴于具体的teamNamedate(在团队数据数组中),我想在{userHash: '', score: '', comment: ''}数组中添加一个新行(userResults

如何在查询父节点和父节点父节点后更新给定文档中的数组?

到目前为止我尝试了什么

我已经尝试findOneAndUpdate了。它直接从根目录插入了一个完整的新文档。

TeamRecordSchema.findOneAndUpdate(
    {teamName: teamName, data: {date: today}}, 
    {$set:{teamName: teamName, data: {date: today, userResults: [userResponse]}}}, 
    {new: true, upsert: true}, 
    function(err, savedDoc){

       // Do stuff with err and savedDoc

});

我已经尝试了save,而且它只是在我的数据库中的根级别创建了一个完整的新文档

const _userResponse = new TeamRecordSchema(teamUserResponse);
_userResponse.save((err, savedDoc) => {

    // Do stuff with err and savedDoc accordingly     

 });

我还根据文档尝试了多种变体,但是我得到了相同的结果或错误。

非常感谢任何指针建议 - 提前感谢:)

1 个答案:

答案 0 :(得分:1)

您必须使用$positional运算符。

您包含date中的字段(data)以找到元素的索引,并将更新部分中查询部分中找到的索引替换为占位符($)推送userResults中的元素。

TeamRecordSchema.findOneAndUpdate( 
  {teamName: teamName, 'data.date': today}}, 
  {$push:{'data.$.userResults': {userHash: '', score: '', comment: ''}}}, 
  {new: true, upsert: true}, 
   function(err, savedDoc){ }
);