[英]Set mongo's _id with a custom UID
背景:
我无法控制DB文档称为Things的发布事件 。 帖子发布时,我编写了一个名为findOrCreate()
的函数(它将在Things文档中查找或创建一个record(object?))。 为了减少冗余,我想使用第三方POST有效负载字段nuid
替换该record(object)的默认_id
。
如何将_id替换为称为
nuid
的有效负载字段?
有效负载示例:
curl -H "Content-Type: application/json" -X POST -d '{"participant":{"nuid":"98ASDF988SDF89SDF89989SDF9898"}}' http://localhost:9000/api/things
架构
'use strict';
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var ThingSchema = new Schema(
{nuid: String}
);
module.exports = mongoose.model('Thing', ThingSchema);
thing.controller.js
//*currently this function will have both _id and a nuid (which works but not desirable)
exports.findOrCreate = function(req, res) {
var query = {"nuid": req.body.participant.nuid};
var update = {nuid: req.body.participant.nuid};
Thing.findOneAndUpdate(
query,
update,
{upsert: true},
function(err, thing){
console.log(thing, "thing");
console.log(err, "err");
if(!thing) {
Thing.create(req.body.participant, function(err, thing) {
if(err) { return handleError(res, err); }
});
};
if(err){return handleError(res, err); }
}
);
});
事/ index.js
var express = require('express');
var controller = require('./thing.controller');
var router = express.Router();
router.get('/', controller.index);
router.get('/:id', controller.show);
router.post('/', controller.findOrCreate);
router.put('/:id', controller.update);
router.patch('/:id', controller.update);
router.delete('/:id', controller.destroy);
module.exports = router;
我找到了一个参考,但是鉴于模型是在有效载荷堆栈参考之前发生的,我仍然不了解如何正确使用它
您可以在此处将_id
的值设置为所需的值,也可以使用“ upsert”进行设置。 只需在update语句中使用$setOnInsert
:
var thingSchema = new Schema({
"_id": String
},{ "_id": false });
var Thing = mongoose.model('Thing',thingSchema);
Thing.findByIdAndUpdate("98ASDF988SDF89SDF89989SDF9898",
{ "$setOnInsert": { "_id": "98ASDF988SDF89SDF89989SDF9898" } },
{ "upsert": true },
function(err,doc) {
if (err) throw err;
console.log(doc);
}
)
如果_id
不存在或对匹配的文档应用更新(在该示例中,将不会更新,仅匹配并返回),则会创建一个新文档。
如果您还有其他要更新的数据,请使用$set
或其他运算符作为要更改的字段,而不是_id
。
作为从客户端API生成UUID的替代方法(或出于安全考虑),您可以使用诸如node-uuid
并将生成的内容插入架构中:
var thingSchema = new Schema({
"_id": { "type": String, default: function genUUID() { uuid.v1() } }
},{ "_id": false });
var Thing = mongoose.model('Thing',thingSchema);
Thing.findOneAndUpdate(
{ "uname": "sam" },
{ "$set": { "uname": "sam" } },
{ "upsert": true },
function(err,doc) {
if (err) throw err;
console.log(doc);
}
)
这样,即使没有为操作提供_id
,也会创建一些东西。 这里有一些简单的示例,但是它可以用来设置默认值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.