首页 > 解决方案 > 使用 ObjectId 发布到 mongoDb 多对一关系

问题描述

Mongoose/MongoDB 问题

我有一个包含基本配置文件数据的 Owners 模型。

我有一个辅助模型:OwnersImages 例如

    {
        owner: { 
            type: Schema.Types.ObjectId,
            ref: 'Owners'
        },
        name: String,
        imageUrl: String,
    },
);

我想从客户端将 imageUrl 和名称发布到 OwnersImages 表。例如

          let values = {
            owner: this.state.user._id,
            name: this.state.field,
            imageUrl: this.state.url
          }
          axios.post(`${serverPath}/api/addFieldImage`, values)

但是我不确定如何最好地解决这个问题,链接它等等。

我可以在Owners表上执行 GET 请求以获取Owner数据,但随后将其作为值的一部分发布到OwnerImages无法成功链接两个表。

我是否只需要在其中存储对所有者 ID 的字符串引用,OwnerImages还是有更智能的方法来执行此操作?

或者我应该将用户 ID 的字符串发布到 mongoose,然后从那里映射到 Owner 表?

试图以最好的方式解释这种方法,但眼睛很累,所以请询问是否有任何困惑!非常感谢

标签: reactjsmongodbmongooseaxios

解决方案


在没有看到您的确切设置的情况下,我认为您可以修改它以满足您的需求:

// In the Schema/Model files
const ownersSchema = Schema({
  // other fields above...
  images: [{ type: Schema.Types.ObjectId, ref: 'OwnersImages' }]
});

const ownersImagesSchema = Schema({
  // other fields above...
  owner: { type: Schema.Types.ObjectId, ref: 'Owners' },
});


// in the route-handler
Owners.findById(req.body.owner, async (err, owner) => {
  const ownersImage = new OwnersImages(req.body);
  owner.images.push(ownersImage._id);
  await ownersImage.save();
  await owner.save();
});

作为旁注,我认为模型通常具有单数名称,例如 Owner 和 OwnerImage。然后该集合将自动采用复数形式。只是思考的食物。

当您想加载这些时,您可以将它们与populate(). 考虑在参数为id的某个路由处理程序中加载所有OwnersImages与 an 关联的内容:Owners/:idOwners

Owners
  .findOne({ _id: req.params.id })
  .populate('images')
  .exec(function (err, images) {
    if (err) return handleError(err);
    // do something with the images...
  });

推荐阅读