当前位置: 首页 > 知识库问答 >
问题:

访问mongoose父文档以获取子文档中的默认值

鲁建茗
2023-03-14

我有一个用于Express/Mongo健康跟踪应用程序的后端API。

每个用户都有一个权重数组,子文档包含一个值、一个单位和记录的日期。如果未指定单元,则默认为'lb'

const WeighInSchema = new Schema({
  weight: {
    type: Number,
    required: 'A value is required',
  },
  unit: {
    type: String,
    default: 'lb',
  },
  date: {
    type: Date,
    default: Date.now,
  },
});

每个用户还有一个defaultUnit字段,可以为该用户指定默认单位。如果该用户在未指定单位的情况下发布称重输入,则称重输入应使用用户的默认单位(如果存在),否则默认为'lb'

const UserSchema = new Schema({
  email: {
    type: String,
    unique: true,
    lowercase: true,
    required: 'Email address is required',
    validate: [validateEmail, 'Please enter a valid email'],
  },
  password: {
    type: String,
  },
  weighIns: [WeighInSchema],
  defaultUnit: String,
});

该逻辑的正确位置在哪里?

我可以在我的WeighInsController的create方法中轻松做到这一点,但这在最好的情况下似乎不是最佳实践,在最坏的情况下是一种反模式。

// WeighInsController.js

export const create = function create(req, res, next) {
  const { user, body: { weight } } = req;
  const unit = req.body.unit || user.defaultUnit;
  const count = user.weighIns.push({
    weight,
    unit,
  });
  user.save((err) => {
    if (err) { return next(err); }
    res.json({ weighIn: user.weighIns[count - 1] });
  });
};

在Mongoose模式中,似乎不可能指定对父文档的引用,但我认为更好的选择是在子文档的pre('validate')中间件中。我也看不到在子文档中间件中引用父文档的方法。

注意:这个答案不起作用,因为我不想覆盖所有用户的称重单位,只是在POST请求中未指定时。

我是不是卡在控制器里了?我从Rails开始,所以我脑子里刻着“胖模特,瘦控制器”。

共有1个答案

单嘉泽
2023-03-14

您可以使用this.parent()函数从子文档(WeighIn)访问父级(用户)。

但是,我不确定是否可以在子文档中添加一个static,这样就可以实现如下操作:

user.weighIns.myCustomMethod(req.body)

相反,您可以在UserSchema上创建一个方法,如addWeghtIn:

UserSchema.methods.addWeightIn = function ({ weight, unit }) {
  this.weightIns.push({
    weight,
    unit: unit || this.defaultUnit
  })
}

然后只需调用控制器中的user.addWeghtIn函数,并将req.body传递给它。这样,你会得到“胖模特,瘦控制器”。

 类似资料:
  • 我有一份这样的文件: 我想通过将其与数量字段(2*800)相乘来更新价格字段,其中的结果将更新/分配给价格。(对于本例,价格更新为1600)。 更新后的文档: 我的选择查询如下: 我怎样才能做到这一点?

  • Mongoose 是在 Node.js 异步环境下对 MongoDB 进行便捷操作的对象模型工具。 让我们面对这样的困境,编写MongoDB验证,转换和业务逻辑是非常麻烦的。所以我们发明了Mongoose。 Mongoose为模型提供了一种直接的,基于scheme结构去定义你的数据模型。它内置数据验证, 查询构建,业务逻辑钩子等,开箱即用。

  • 我想使用mongoose从多个文档更新多个子文档。 我目前的代码是: 模式的一部分是: 但是这段代码只更新id arr中的最后一个元素。

  • 问题内容: 我正在尝试编写一个JavaScript应用程序,该应用程序将在页面的iFrame中加载按钮。此应用程序将读取父文档并删除所有图像,应用最小的样式,然后使用此新标记的页面重新加载父文档。 我遇到的问题是从iFrame读写父文档。有人知道实现此目标的方法吗?我已经阅读了一些有关跨域消息传递的内容,但是不确定其他选择,哪种方法最好。 提前致谢。 问题答案: 您可以使用父对象或始终指向最外面文

  • 每个食谱文档包含三个内容。一个名为的字段,其中存储菜谱的名称;一个名为的字段,其中存储创建者uid的,以及一个名为的子集合,其中包含带有一些随机字段的文档。 问题是,使用这些规则只能创建菜谱文档。子集合及其文档不会创建,因为db表示 FirebaseError:[code=permission-denied]:缺少权限或权限不足。FirebaseError:缺少权限或权限不足。

  • Elasticsearch 提供实时获取文档的方法。这意味着只要文档被索引且客户端收到消息确认后,你就可以立即在任何的分片中检索文档。Get 操作通过 index/type/id 方式请求一个文档信息: $params = [ 'index' => 'my_index', 'type' => 'my_type', 'id' => 'my_id' ]; // Get doc