mongo联表查询

订单表结构(动态外键):

var orderSchema = new mongoose.Schema({
    uid: { type: String, required: true },  // 用户id
    amount: { type: Number, required: true },
    oType: { type: Number, required: true }, // 订单类型
    status: { type: Number, required: true }, // 订单的状态:1完成  2未完成 3失效
})

用户表:

var userSchema = new mongoose.Schema({
      phone: String,
      status: String,
      createdAt: Date,
      updatedAt: Date
})

请问,1怎么设置这个外键,跟用户的主键一致呢?
2,mongodb设置自增id怎么设置呢?
3,有没有我自动增加了一个用户,对应的对单列表就自动增加一个订单呢?

阅读 2.2k
2 个回答
  1. 使用DBRef可以达到外键效果,但是你也可以通过设置关系字段来实现。
  2. MongoDB的_id是自增的——但不是整数自增。这里的自增只指MongoDB的_id原理确实与先后顺序有关,但是由于类型是独有的ObjectId,因此无法通过常规思路去处理。事实上ObjectId你可以当作是一个索引中的一个key,其对应的是一个timestamp。但是有个小小问题,在我的记忆里看过一篇文章,当文档更新时,若文档增长数据量超出原来的空间准备,那么这条数据会被删除,而重新在集尾插入。但是我想,对于ObjectId而言是没有什么影响的。实现整数自增,依然需要代码逻辑实现。

    • 创建一个集合,专门记录各集合的整数id高度,每次插入数据时使用记录高度。
    • 新建字段作为自增id,插入前查询最近数据的id,然后+1插入
  3. 自增用户时增加一条订单,MongoDB的事务实现我还没有更好的头绪,一般通过代码逻辑去做。

补充一下楼上的回答

  1. ObjectId实际上是客户端生成的,所以你可以在插入之前先生成好ObjectId然后直接赋值给user和order。或者,也可以在插入user对象后去取它的_id,再赋值给order。
  2. ObjectId就是自增的。分布式环境下不应该用数字序列的自增ID,原因我在这个问题中解释过:mongoDB修改"_id"的objectID到普通递增id为什么不好。楼上提到的走出原来的空间会移动的问题是针对<=2.6版本的MMAPv1引擎,WiredTiger不存在这个问题,而且这个问题跟自增ID也没什么关系。
  3. 这个需求本质上是分布式事务。现在没有哪个NoSQL数据库直接支持了分布式事务。MongoDB将在下一个版本4.0中增加对分布式事务的部分支持(只在复制集中),预计在今年年中某个时间推出。变通的办法,3.6推出了change stream,基于change stream实现你要的功能会更方便一些。
推荐问题
宣传栏