2016-04-12 58 views
2

我正在將我的API從Parse.com遷移到我自己的Express.js代碼。我創建了我的貓鼬模型來匹配由parse創建的數據庫,但我遇到了有關指針(關係)的問題。使用Mongoose填充字段的子字符串

下面是兩種模式(簡體儘可能)

const CustomerSchema = new mongoose.Schema({ 
    _id   : { type: String, required: true, default:() => randomstring.generate(10) }, 
    name   : { type: String, required: true, trim: true }, 
    _p_group  : { type: String, required: true, trim: true, set: v => `Group\$${v}`, get: v => v.substr(6) }, 
}); 


const GroupSchema = new mongoose.Schema({ 
    _id   : { type: String, required: true, default:() => randomstring.generate(10) }, 
    name   : { type: String, required: true, trim: true }, 
}); 

因此,這裏的問題:_p_group是一個「指針」到Group,但解析不會將ID存儲在它,而不是它商店Group$THE_ID。例如,如果客戶來自編號爲ndj879gLjt的組,則_p_group將包含Group$ndj879gLjt

我該如何處理關係?我如何退回客戶及其團隊?通常的做法是將ref: "Group"添加到_p_group的選項中並執行Customer.find({}).populate('_p_group'),但由於顯而易見的原因,它在此處不起作用。

解析正在使用mongodb(但不是貓鼬)所以必須有某種方式。此外,解決方案必須與Parse兼容。在最壞的情況下,我仍然可以創建一個包含id的新字段_customer,但這會使我更新數據的20Go,這實際上並不是我想要的。

回答

-2

所以在看Parse Server source code之後好像是他們實際上在做幾個請求,根本不用填充。他們首先會找到匹配查詢的所有Customers,然後遍歷結果以獲取groupId的列表,並且他們查詢Group其中_id in [list of groupId]

+0

爲什麼在地獄裏我會得到一個downvote工作?如果這不是Parse如何解釋,否則它是一個有效的答案。這不是一個「乾淨利落」的答案,但它仍然是當前Parse工作的方式,人們可能想知道或可能想要做同樣的事情。 – Melvin

-1

對於填充工作,您的類型應爲mongoose.Schema.ObjectId,以便存儲ObjectId,並且屬性ref應該是集合的名稱。

我認爲下列情況應populate

const CustomerSchema = new mongoose.Schema({ 
    _id   : { type: String, required: true, default:() => randomstring.generate(10) }, 
    name   : { type: String, required: true, trim: true }, 
    _p_group  : { type: mongoose.Schema.ObjectId, ref: 'Group', required: true, trim: true }, 
}); 
+0

在一個完美的世界裏,它會,但是'_p_group'由Parse設置,並且會在其中放置一個(特殊)'String'。將類型更改爲ObjectId會破壞與Parse的兼容性。我的數據庫中已經有數百萬行,我不能簡單地改變它的類型。 – Melvin

+0

啊對。你可以將'ref'傳遞給填充調用,即:Customer.find()。populate('_ p_group',null,'Group')',但是這仍然會導致'_id'出現'Group $'在它之前。我不確定執行的順序,但也許你可以綁定到'CustomerSchema.post('find',function(r,n){r = r.map(function(a){a._id.replace( 'Group $',''); return a;}; n()});'處理這個ID,不知道是否會在填充之前被調用,只是猜測而已 – mani

+0

好主意,但不幸的是它沒有工作時,代碼被調用得太晚,'post'實際上是在'_p_group'上設置getter後調用的。 – Melvin