我正在尝试更新对象数组中的值。 查看上面的mongoDB模式,我想要的是: 查找ID与_id匹配的费用,并需要使用req.body中的新字段更新字段。 只需更新以下内容:expensesType,描述,价格和状态。
以下代码是我尝试执行的操作。 首先,我需要匹配适当的费用,它可以正常工作,但是当我尝试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");
});
});
答案 0 :(得分:0)
您现在真的很容易回答问题find
和UpdateOne
之间的语法差异
这是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
,因为更新一个
返回
所以您的代码应该是
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