繁体   English   中英

使用自定义UID设置mongo的_id

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM