猫鼬:将对象插入子文档数组

时间:2020-09-24 01:50:41

标签: javascript mongodb mongoose mongodb-query mongoose-schema

我正在尝试将时间对象插入times数组中,以用于特定用户的特定活动名称。例如,如果用户是“ someuser”,而我想为吉他演奏时间增加时间,则我不确定该怎么做。

{
  username: "someuser",
  activities: [
    {
      name: "guitar",
      times: []
    },
    {
      name: "code",
      times: []
    }
  ]
}, {
  username: "anotheruser",
  activities: []
}

这是我目前拥有的功能,我无法弄清楚自己在做什么错,任何帮助将不胜感激:

function appendActivityTime(user, activityName, newRange) {
  User.updateOne(
    {username: user, 'activities.name': activityName},
    { $push: {'activities.$.times': {newRange}},
    function (err) {
      if (err) {
          console.log(err);
        } else {
          console.log("Successfully added time range: " + newRange);
        }
    }}
  );
}

appendActivityTime("someuser", "guitar", rangeObject);

2 个答案:

答案 0 :(得分:0)

我已经尝试了您的尝试,并且对我有用:

db.getCollection("test").updateOne(
  { username: "someuser", "activities.name": "guitar" },
  { $push: { "activities.$.times": { from: ISODate(), to: ISODate() } } } //Don't worry about ISODate() in node.js use date objects
)

结果:

{ 
    "_id" : ObjectId("5f6c384af49dcd4019982b2c"), 
    "username" : "someuser", 
    "activities" : [
        {
            "name" : "guitar", 
            "times" : [
                {
                    "from" : ISODate("2020-09-24T06:15:03.578+0000"), 
                    "to" : ISODate("2020-09-24T06:15:03.578+0000")
                }
            ]
        }, 
        {
            "name" : "code", 
            "times" : [

            ]
        }
    ]
}

我建议您使用的是arrayFilter,它们更加精确,当您习惯它们时,它们变得非常方便

答案 1 :(得分:0)

如果您不确定是否要更新嵌套文档,请让猫鼬进行查询。

让文档=等待Model.findOne({});

document.activities = new_object;

等待document.save();