如何使用 Mongoose 只更新 MongoDB 中的一个属性?

Posted

技术标签:

【中文标题】如何使用 Mongoose 只更新 MongoDB 中的一个属性?【英文标题】:How to update only one property in MongoDB using Mongoose? 【发布时间】:2020-02-26 23:21:03 【问题描述】:

这是我的模型:

import mongoose from 'mongoose';

const UserData = new mongoose.Schema(
    additionalData: Array,
    name: String,
);
mongoose.model('UserData', UserDataSchema);
mongoose.set('useFindAndModify', false);

export default mongoose.model('UserData');

如何更新UserData 模型的additionalData 属性,例如附加另一个数组。

假设附加数组是

[ 1, 2, 3]

【问题讨论】:

【参考方案1】:

您可以使用$addToSet

await UserData.update(name:"something", $addToSet:  additionalData: [1,2,3] )

await UserData.updateOne(name:"something", $addToSet:  additionalData: [1,2,3] )

如果您没有条件这样做,这将添加到所有文档中

await UserData.update(, $addToSet:  additionalData: [1,2,3] )

如果要从数组中删除多个值,请使用$pull

await UserData.update(, $pull:  additionalData:  $in: [ 1, 2,3 ] )

如果你想删除单个值

await UserData.update(, $pull:  additionalData:1 )

【讨论】:

但是为什么我需要name,我正在尝试进行迁移,所以它总是被填充? 但是你需要一些条件对吗?? ,更新位置(用 sql 术语) 这似乎很好用,谢谢。与此相反的是什么,因为我也需要向下迁移选项? 我的意思是你想删除??数组中的值? 什么是删除,或恢复到原来的样子?【参考方案2】:

如果这不是你的意思,请在 cmets 中告诉我,我会编辑答案。

const newArray = [ 1, 2, 3];
const nameToUpdate = 'foo';
mongoose.model('UserData').updateMany(
    name: nameToUpdate
, $set: 
    additionalData: newArray
);

【讨论】:

我们应该使用updateMany() 还是updateOne(),因为这只是一个属性? updateOne 并不意味着您将只更新一个属性。这意味着您将只更新一个 document 。您的架构有多个具有多个属性的文档。如果你想用一个查询更新多个文档(例如,每个名为“foo”的文档),你应该使用updateMany。另一方面,如果您想确保您的查询将只更新一个文档并且无论有多少属性,您都应该使用updateOne

以上是关于如何使用 Mongoose 只更新 MongoDB 中的一个属性?的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB:如何使用 Mongoose 添加或更新子文档?

如何使用 MongoDB/Mongoose 中的先前值更新字段 [重复]

如何在 mongodb/mongoose 的嵌套数组中检查是不是存在并更新对象?

如何在 mongoose 和 mongodb 中更新嵌套模型

MongoDB(Mongoose)更新数组数组中的元素

如何在 Mongoose 中更新/更新文档/数据? Passport MongoDB、Express、AngularJS、Nodejs