Node Mongoose - 在收到 mongoId 后将嵌入式文档保存在 API

Node Mongoose - saving embedded documents on API once receiving mongoId

我想知道解决当前情况的最佳方法。 我有一个使用 mongoose 和 bluebird 的节点 API。一些 Android 客户将 post "movement" 个实体加入它。

(问题在最后)

假设 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上相关导出的Schema如下:

"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

JSON Android 客户端 post 的示例:{"movementId":1, "relMovementId":4138, "_party":"58dbfe26194cfc5a9ec9b7c5"}

我现在很困惑,不确定是否由于 Android 是 posting JSON 的方式,我需要两个模式;一个用于接收到的对象(即:使用 ObjectId 和对 Party 的引用),第二个用于对象的持久化(即:使用引用的模式 _party: Party.Schema)或者如果我可以做一些更简单的事情 populate在保存之前...或者什么。

为了结束这个: 我已经实施了我在写问题时想到的一种方法。运动架构已更改,因此:_party:Party.Schema 当我得到 POST 来创建新动作时,我执行 getById 并使用该 exec 的结果将值填充为嵌入式文档。