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

MongoDB Mongoose用嵌套对象保存对象

金阳华
2023-03-14

我是MongoDB的新手,我正在用Mongoose创建一个简单的数据库,模型如下:用户、游戏和玩家。

因此,一个用户不包含或包含多个游戏。每个游戏都有一个玩家,每个玩家都指一个用户。如下所示(为了清晰起见,我简化了模式):

const UserSchema = new Schema({
  name: String,
  games: [{
    type: Schema.Types.ObjectId,
    ref: 'game'
  }]
});

const GameSchema = new Schema({
  mode: Number,
  players: {
    type: [{
      type: Schema.Types.ObjectId, 
      ref: 'player'
    }],
    required: true
  }
});

const PlayerSchema = new Schema({
  order: Number,
  isWinner: Boolean,
  user: {
    type: Schema.Types.ObjectId,
    ref: 'user',
    required: true
  }
});

因此,现在在前端,我想向后端发送一份请愿书,为用户Joe(_id:11111)和Bob(_id:22222)创建一个新游戏,因此我向/api/games发送了一篇帖子,帖子的主体是{users:[111112222]}

现在我的问题是,对于后端来说,创建一个新游戏,它也必须创建2个玩家。实现这一点的最好方法是什么?

在游戏中。create()方法,我应该检索数据、创建并保存玩家、创建游戏、分配玩家、保存游戏,以及更新用户和添加游戏ID吗?

我还了解了Mongoose中间件,您可以将某些函数设置为在某些操作之前或之后执行。所以也许它更好:在比赛前做准备。创建,在游戏开始前创建玩家post功能。创建,以更新用户

最后一个看起来更干净。最好的办法是什么?也许还有一个我没有考虑过的?

谢谢

共有1个答案

经景辉
2023-03-14

我建议您使用猫鼬中间件中定义的post和前函数。它们使用起来非常简单整洁。它可能会解决你的问题。

这是我们遇到的一个问题的个人例子;在我们的例子中,我们必须从数据库中的序列中分配一个用户ID。我们使用了以下代码:

var UserSchema   = new Schema({
username: { type: String, required: true, unique: true },
id: { type: String },
...
});

UserSchema.pre('save', function(next) {
  let doc = this;     
  let id = 'userSeq'    

Sequence.findByIdAndUpdate(id, { $inc : {nextSId : 1} }, function(error,data) {         
    if(error)
        next(error)               
    doc.id = data.nextSId-1;
    next();
  })        
});

我的建议是,在你创建游戏之前,你可以搜索用户,并添加对游戏的引用。如果我是你,我会使用mongodb的findAndModify查询来查找用户,或者在用户还不存在的情况下创建用户。

 类似资料:
  • 我有GWT的Spring入学申请。在服务器端,我为所有实体提供了简单的JpaRepository接口,例如: 有一个MyEntity类与My其他Entity类有一对一的关系。当我调用我的实体服务持久化方法时 将只保存myEntity对象。MyEntity的所有子对象都被忽略。保存myEntity对象和myOtherEntity对象的唯一方法是调用 在上面的代码之前。那么有没有更优雅的方法来使用Jp

  • 我将spring boot与thymeleaf结合使用,在页面中尝试显示表单及其嵌套对象。 我的对象工厂有 id 当我显示时 我的工厂有很多机器,但没有一台展出 任何想法?

  • 我创建映射如下所示。如何将平面dto对象属性(街道、城市等)映射到域对象中的嵌套地址。当我试着去做的时候,我发现了一个错误: [错误]诊断:返回类型中的属性“Address.PostalCode”未知。@Mapping(来源=“City”,目标=“Address.City”), 还有类...

  • 问题内容: 我的映射是: 我想获取所有没有字段的文档。 我试过了: 返回所有文档。基于ElasticSearch2.x,存在用于嵌套字段的过滤器不起作用的问题,我也尝试过: 返回0个文档。 使所有缺少该字段的文档的正确查询是什么? 问题答案: 我找到了正确的语法,应该是:

  • 让我们考虑一下这些帖子的集合。每个帖子都有一个评论数组,每个评论都有一个字符串数组,带有键“likes”,表示喜欢该评论的用户。 如何使用mongoose检查用户是否喜欢具有给定ID的评论?