2017-04-17 58 views
0

我想知道解決當前場景的最佳方法。 我有一個使用貓鼬和藍鳥的節點API。一些Android客戶端會發布「移動」實體。節點Mongoose - 一旦接收到mongoId就在API上保存嵌入式文檔

(問題在最後)。

假設movement-model.js出口的模式,看起來像這樣:

"use strict"; 

const mongoose = require('mongoose'); 

const _movementSchema = { 
    movementId: { type: Number, requried: true }, 
    relMovementId: Number, 
    _party: { type: mongoose.Schema.Types.ObjectId, required: true, ref: 'Party' } 
} 

module.exports = mongoose.Schema(_movementSchema, {collection: 'movement'}); 

及相關出口模式上party-model.js如下:

"use strict"; 

const mongoose = require('mongoose'); 

const _partySchema = { 
    active: { type: Boolean, default: true }, 
    name: { type: String, trim: true, required: true }, 
    logo: { type: Buffer }, 
    coordenates: { lat: Number, long: Number }, 
    startOn: { type: Date, required: true }, 
    endOn: { type: Date, required: true } 
} 

module.exports = mongoose.Schema(_partySchema, {collection: 'party'}); 

Android客戶端將與的ObjectId,而不是發送JSON完整填充的對象。所以,當POST來,我就直接使用它(即:let _movement = req.body;),並在movement-dao.js我已經得到了createNew方法,我導出型號:

"use strict"; 

const mongoose = require('mongoose'); 
const Promise = require('bluebird'); 
mongoose.Promise = Promise; 
const movementSchema = require('../model/movement-model'); 

movementSchema.statics.createNew = (movement) => { 
    return new Promise((resolve, reject) => { 
    if (!_.isObject(movement)) { 
     return reject(new TypeError('Movement is not a valid object.')); 
    } 

    let _something = new Movement(movement); 

    _something.save((err, saved) => { 
     err ? reject(err) 
      : resolve(saved); 
    }); 
    }); 
} 

const Movement = mongoose.model('Movement', movementSchema); 

module.exports = Movement; 

我想做到的是要:保存移動收藏時使用_party,因爲正式文檔正處於保存時刻,我的意思是一個嵌入文檔的副本,不會受到締約方文檔未來更新的影響。

雖然我無法更改Android客戶端,但我仍然只能從中獲得ObjectId

什麼Android客戶端將發佈

JSON例如:{"movementId":1, "relMovementId":4138, "_party":"58dbfe26194cfc5a9ec9b7c5"}

我現在很困惑,不知道是否由於道路Android是張貼JSON,我需要兩個模式;一個用於接收對象(即:用ObjectId並引用Party),另一個用於對象持久化(即:模式引用爲_party: Party.Schema),或者如果我可以在保存之前做一些簡單的populate ...或者。

回答

0

爲了解決這個問題: 我在寫問題的時候已經實現了我想到的一種方法。移動模式已更改,因此:_party:Party.Schema 當我獲取POST來創建新移動時,我執行getById並使用該exec的結果將該值填充爲嵌入式文檔。