Node Mongoose - 一旦收到mongoId

时间:2017-04-17 03:30:16

标签: node.js mongoose mongoose-schema mongoose-populate

我想知道解决当前情况的最佳方法。 我有一个使用猫鼬和蓝鸟的节点API。一些Android客户将发布"运动"它的实体。

(最后的问题)。

让我们说movement-model.js导出Schema,看起来像这样:

"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保存动作集合,因为完整的派对文档是在保存时,我的意思是一份包含Party文档副本的嵌入式文档,不受未来对Party文档所做更新的影响。

虽然我无法更改Android客户端,但我仍然只能从中获取ObjectId

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

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

1 个答案:

答案 0 :(得分:0)

为了解决这个问题: 在编写问题时,我已经实现了我想到的一种方法。移动架构已更改为:_party:Party.Schema 当我获得POST以创建新的移动时,我会执行getById并使用该exec的结果将该值填充为嵌入式文档。