【问题标题】:Updating embedded documents in mongoose更新 mongoose 中的嵌入文档
【发布时间】:2021-06-02 14:49:41
【问题描述】:

我有一个用户和一个高级架构。高级版嵌入在用户中。

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 属性,但没有在高级集合本身中更新它。是不是我做错了什么?

【问题讨论】:

    标签: javascript mongodb mongoose


    【解决方案1】:

    您可以使用 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)将对象保存在用户集合本身中。 在这种情况下,两个集合之间没有引用:数据将仅保存在用户集合中,作为子文档。 您只是为子定义架构,不会为数据库中的子创建单独的集合,而是将整个子文档嵌入到父(用户)中。

    示例数据:

    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 集合完全分开。 如果您还想升级高级系列,您可以使用两个不同的调用来完成,一个用于用户,一个用于高级。

    【讨论】:

    • 感谢您的回答,我知道有很多方法可以更新嵌入式文档数组。但我的问题是猫鼬只更新嵌入文档中的属性。它不会在集合中更新它(在我的情况下是它的高级集合)?
    • 我现在明白了。我以为猫鼬会为我做到这一点。非常感谢。
    猜你喜欢
    • 2014-06-12
    • 2023-03-10
    • 2011-12-21
    • 1970-01-01
    • 2011-12-04
    • 2018-09-04
    • 1970-01-01
    • 2020-06-07
    • 2016-10-06
    相关资源
    最近更新 更多