鍍金池/ 問答/數據庫  HTML/ mongo聯表查詢

mongo聯表查詢

訂單表結構(動態(tài)外鍵):

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 }, // 訂單的狀態(tài):1完成  2未完成 3失效
})

用戶表:

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

請問,1怎么設置這個外鍵,跟用戶的主鍵一致呢?
2,mongodb設置自增id怎么設置呢?
3,有沒有我自動增加了一個用戶,對應的對單列表就自動增加一個訂單呢?

回答
編輯回答
執(zhí)念
  1. 使用DBRef可以達到外鍵效果,但是你也可以通過設置關系字段來實現。
  2. MongoDB的_id是自增的——但不是整數自增。這里的自增只指MongoDB的_id原理確實與先后順序有關,但是由于類型是獨有的ObjectId,因此無法通過常規(guī)思路去處理。事實上ObjectId你可以當作是一個索引中的一個key,其對應的是一個timestamp。但是有個小小問題,在我的記憶里看過一篇文章,當文檔更新時,若文檔增長數據量超出原來的空間準備,那么這條數據會被刪除,而重新在集尾插入。但是我想,對于ObjectId而言是沒有什么影響的。實現整數自增,依然需要代碼邏輯實現。

    • 創(chuàng)建一個集合,專門記錄各集合的整數id高度,每次插入數據時使用記錄高度。
    • 新建字段作為自增id,插入前查詢最近數據的id,然后+1插入
  3. 自增用戶時增加一條訂單,MongoDB的事務實現我還沒有更好的頭緒,一般通過代碼邏輯去做。
2017年11月11日 23:20
編輯回答
淺淺

補充一下樓上的回答

  1. ObjectId實際上是客戶端生成的,所以你可以在插入之前先生成好ObjectId然后直接賦值給user和order?;蛘?,也可以在插入user對象后去取它的_id,再賦值給order。
  2. ObjectId就是自增的。分布式環(huán)境下不應該用數字序列的自增ID,原因我在這個問題中解釋過:。樓上提到的走出原來的空間會移動的問題是針對<=2.6版本的MMAPv1引擎,WiredTiger不存在這個問題,而且這個問題跟自增ID也沒什么關系。
  3. 這個需求本質上是分布式事務?,F在沒有哪個NoSQL數據庫直接支持了分布式事務。MongoDB將在下一個版本4.0中增加對分布式事務的部分支持(只在復制集中),預計在今年年中某個時間推出。變通的辦法,3.6推出了change stream,基于change stream實現你要的功能會更方便一些。
2017年5月6日 01:12