繁体   English   中英

更新 mongoose 中的嵌入文档

[英]Updating embedded documents in mongoose

我有一个用户和一个高级模式。 高级版嵌入在用户中。

 const premiumSchema = new mongoose.Schema( { subscriptionID: { type: String, required: true, }, guild: { type: Object, default: {}, }, payment_id: { type: String, required: true, }, expiry: { type: Date, require: true, }, reminded: { type: Boolean, default: false, }, }, { collection: "premium" } );

 const userSchema = new mongoose.Schema({ discordId: { type: String, required: true, }, accessToken: { type: String, required: true, }, premium: { type: [premiumSchema], required: false, }, });

我正在尝试通过以下方式更新我的高级收藏的价值:

 const user = await User.findOne({ "premium._id": new ObjectId(req.body.premiumId), }); const premium = user.premium.id(new ObjectId(req.body.premiumId)); premium.reminded = true; await user.save();

问题是它更新了我的user.premium数组中的reminded属性,但没有在高级集合本身中更新它。 有什么我做错了吗?

您可以使用 findOneAndUpdate 方法和位置运算符直接更新您的用户。

位置运算符 $ 允许您遍历数组并仅更新相应的子文档

const savedUser = await User.findOneAndUpdate(
  {_id: new ObjectId(req.body.premiumId)},
  {$set: {'premium.$.reminded': true}}
);

请参阅文档: https://docs.mongodb.com/manual/reference/operator/update/positional/

这样您就可以更新 User 集合中的子文档,但不会更新 Premium 集合中的值 这是因为当您在 Users 集合中定义高级属性时,您是在告诉 mongoose(和 mongodb)将 object 保存在用户集合本身中。 在这种情况下,两个 collections 之间没有引用:数据将仅保存在用户集合中,作为子文档。 您只是为子定义架构,不会为数据库中的子创建单独的集合,而是将整个子文档嵌入父(用户)中。

示例数据:

user1: {
  discordId: { 'abc' },
  accessToken: { 'token' },
  premium: {
    subscriptionID: { 'idSubscription' } 
    guild: { },
    payment_id: { 'idPayment' },
    expiry: { '2021-07-31T20:41:19.618+00:00' },
    reminded: { true }
  },
});

两个 User 和 Premium collections 完全分开。 如果您还想升级高级系列,您可以使用两个不同的调用来完成,一个用于用户,一个用于高级。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM