在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/數(shù)據(jù)庫  HTML/ mongo聯(lián)表查詢

mongo聯(lián)表查詢

訂單表結(jié)構(gòu)(動(dòng)態(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怎么設(shè)置這個(gè)外鍵,跟用戶的主鍵一致呢?
2,mongodb設(shè)置自增id怎么設(shè)置呢?
3,有沒有我自動(dòng)增加了一個(gè)用戶,對應(yīng)的對單列表就自動(dòng)增加一個(gè)訂單呢?

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

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

補(bǔ)充一下樓上的回答

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