更新mongodb数组对象内的值

时间:2020-01-29 22:46:03

标签: javascript node.js mongodb mongodb-query

我正在尝试更新对象数组中的值。 查看上面的mongoDB模式,我想要的是: 查找ID与_id匹配的费用,并需要使用req.body中的新字段更新字段。 只需更新以下内容:expensesType,描述,价格和状态。

MongoDB Schema

以下代码是我尝试执行的操作。 首先,我需要匹配适当的费用,它可以正常工作,但是当我尝试house.save()时,会显示一条消息“ house.save不是函数”。所以我认为也许我需要使用mongoDB函数来获取结果。

if __name__ == '__main__':
    python_students = []
    new_list = []
    for _ in range(int(input())):
        name = input()
        score = float(input())
        data = [name, score]
        python_students.append(data)


python_students.sort(key = lambda x: x[1])
minvalue = python_students[0][1]
secondValue = 0
for i in python_students:
    if(minvalue < i[1]):
        secondValue = i[1]
        break

for i in python_students:
    if(secondValue == i[1]):
        new_list.append(i[0])

new_list.sort()

for i in new_list:
    print(i)

******更新了******

搜索后,我找到了这个updateOne,经过调整后,这是我的最终结果,但是这样我删除了每条记录。

router.put("/editExpense/:id", ensureAuthenticated, (req, res) => {
  var id = mongoose.Types.ObjectId(req.params.id);
  House.find(
    { "expensesHouse._id": id },
    {
      members: 1,
      name: 1,
      description: 1,
      address: 1,
      type: 1,
      user: 1,
      userID: 1,
      userType: 1,
      expensesHouse: { $elemMatch: { _id: id } },
      date: 1
    }
  ).then(house => {
    console.log(house);
    expenseType = req.body.expenseType;
    description = req.body.description;
    price = req.body.price;
    status = req.body.status;

    house.save().then(() => {
      req.flash("success_msg", "Expenses Updated");
      res.redirect("/houses/dashboard");
    });
  });
});

***********解决方案*********** 我只是按照下面显示的方式解决了这个问题。

router.put("/editExpense/:id", ensureAuthenticated, (req, res) => {
  var id = mongoose.Types.ObjectId(req.params.id);
  House.updateOne(
    { "expensesHouse._id": id },
    {
      members: 1,
      name: 1,
      description: 1,
      address: 1,
      type: 1,
      user: 1,
      userID: 1,
      userType: 1,
      expensesHouse: { $elemMatch: { _id: id } },
      date: 1
    },
    { $set: { "expensesHouse.expenseType": req.body.expenseType } }
  ).then(house => {
    req.flash("success_msg", "Expenses Updated");
    res.redirect("/houses/dashboard");
  });
});

2 个答案:

答案 0 :(得分:0)

您现在真的很容易回答问题findUpdateOne之间的语法差异

这是Find的期望,请检查MongoDB docs

db.collection.find(query, projection)

这是updateOne的期望,请检查Mongo docs

 db.collection.updateOne(
   <filter>,
   <update>,
   {
     upsert: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ],
     hint:  <document|string>        // Available starting in MongoDB 4.2.1
   }
)

看到区别了吗?第二个参数应该是update而不是projection,因为更新一个 返回

  • matchedCount 包含匹配的文档数
  • modifiedCount 包含已修改文档的数量
  • upsertedId 包含 upserted 文档的_id。
  • 如果操作在运行时带有写关注点,则布尔值确认为true;如果禁用写关注点,则确认为false。

所以您的代码应该是

House.updateOne(
    { "expensesHouse._id": id },
    { $set: { "expensesHouse.expenseType": req.body.expenseType } }
  ).then(house => {
    req.flash("success_msg", "Expenses Updated");
    res.redirect("/houses/dashboard");
  });
});

答案 1 :(得分:0)

House.findOneAndUpdate({userId : req.params.userId}, 
    { $set: { "expensesHouse.$[element].status": req.body.status } },
    { multi:true, arrayFilters: [{ "element.userID" : req.params.subUserId }], new:true })

您的Api请求由两个ID(外部和内部)组成,例如/api/update/:userId/:subUserId