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 的结果将值填充为嵌入式文档。
我想知道解决当前情况的最佳方法。 我有一个使用 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 的结果将值填充为嵌入式文档。