猫鼬多对一插入

时间:2015-04-30 14:04:43

标签: node.js mongodb insert mongoose

我需要帮忙! 我正在用nodejs和mongo创建一个用于学习的网站。

我有一个问题,我知道最好的方法。 我在表codes中有两个集合tagcodes我的tags字段是tags的数组。

CodeModel:

var CodeSchema   = new Schema({
    title:  { type: 'String', required: true },
    text:   { type: 'String', required: true },
    url:    { type: 'String', required: true },
    uri:    String,

    createdAt: { type: Date, default: Date.now },
    updatedAt: { type: Date, default: Date.now },

    owner: {
        type: Schema.ObjectId,
        ref: 'User'
    },

    tags:   [
        {
            type: Schema.ObjectId,
            ref: 'Tag'
        }
    ]

});

CodeSchema.pre("save", function (next) {
    // if create for first time
    if (!this.created_at) {
        this.created_at = Date.now();
    }

    next();
});

module.exports = mongoose.model('Code', CodeSchema);

和我的标签模型:

var mongoose     = require('mongoose');
var Schema       = mongoose.Schema;

var TagSchema = new Schema({
    name: 'string'
});

module.exports = mongoose.model('Tag', TagSchema);

当我在休息时得到结果时,我得到了它:

[
  {
    "_id": "5540f557bda6c4c5559ef638",
    "owner": {
      "_id": "5540bf62ebe5874a1b223166",
      "token": "7db8a4e1ba11d8dc04b199faddde6a250eb8a104a651823e7e4cc296a3768be6"
    },
    "uri": "test-save",
    "url": "http://www.google.com.br/",
    "text": " hello  ",
    "title": "testing...",
    "__v": 0,
    "tags": [
      {
        "_id": "55411700423d29c70c30a8f8",
        "name": "GO"
      },
      {
        "_id": "55411723fe083218869a82d1",
        "name": "JAVA"
      }
    ],
    "updatedAt": "2015-04-29T15:14:31.579Z",
    "createdAt": "2015-04-29T15:14:31.579Z"
  }
]

这是我填入数据库,我不知道如何插入它,有没有任何方法自动与猫鼬做或我需要自己创建? 我正在测试这个json:

{
  "url": "http://www.google.com.br/",
  "title": "Test inset",
  "text": "insert code",
  "tags": [
    "ANGULAR",
    {
        "_id": "55411700423d29c70c30a8f8",
        "name": "GO"
    }
  ]
}

如果我有id,我需要插入标签。我需要创建它还是有办法自动完成它? 我该怎么办?

抱歉,我的英语= x

2 个答案:

答案 0 :(得分:1)

一般来说,使用mongooseJS在mongo数据库中创建和保存文档非常简单(假设您连接到数据库):

var localDocObj = SomeSchemaModel(OPTIONAL_OBJ); // localDocObj is a mongoose document
localDocObj.save(CALLBACK); // save the local mongoose document to mongo

如果您有一个与模式具有相同形式的对象,则可以将其传递给构造函数,以使用该对象的属性为mongoose文档对象设定种子。如果对象无效,则会在验证或保存时传递给回调函数的失效错误。

给出你的测试对象和模式:

var testObj = {
  "url": "http://www.google.com.br/",
  "title": "Test inset",
  "text": "insert code",
  "tags": [
    "ANGULAR",
    {
      "_id": "55411700423d29c70c30a8f8",
      "name": "GO"
    }
  ]
};

var codeDoc = Code(testObj);
codeDoc.save(function (err, doc) {
  console.log(err); // will show the invalidation error for the tag 'Angular'
});

由于您将Tag存储为单独的集合,因此在插入新的Code文档之前,您需要获取/创建任何字符串值的标记。然后,您可以使用新的Tag文档代替Code文档的字符串值。这将创建一个异步流,您可以使用Promises(在较新的节点版本中可用)进行管理。

// Create a promise for all items in the tags array to iterate over
// and resolve for creating a new Code document
var promise = Promise.all(testObj.tags.map(function(tag) {
  if (typeof tag === 'object') {
    // Assuming it exists in mongo already
    return tag;
  }

  // See if a tag already exists
  return Tag.findOne({
    name: tag
  }).exec().then(function(doc) {
    if (doc) { return doc; }

    // if no tag exists, create one
    return (Tag({
      name: tag
    })).save(); // returns a promise
  });
})).then(function(tags) {
  // All tags were checked and fetched/created if not an object
  // Update tags array
  testObj.tags = tags;

  // Finally add Code document
  var code = Code(testObj);
  return code.save();
}).then(function(code) {
  // code is the returned mongo document
  console.log(code);
}).catch(function(err) {
  // error in one of the promises
  console.log(err);
});

答案 1 :(得分:0)

你可以这样做

var checkNewTagAndSave = function(data, doc, next){ // data = req.body (your input json), doc = mongoose document to be saved, next is the callback
    var updateNow = function(toSave, newTags){
      // save your mongoose doc and call the callback.
      doc.set(toSave);
      doc.save(next);
    };
    var data = req.body;
    var tagsToCreate = [];
    var tagids = [];
    data.tags.forEach(function(tag, index){
      if(typeof(tag) == 'string') {
        tagsToCreate.push({ name: tag });
      } else tagids.push(tag._id);
    });
    data.tags = tagids;
    if(tagsToCreate.length === 0) updateNow(data);
    else {
      mongoose.model('tag').create(tagsToCreate, function(err, models){
        if(err || !models) return next(err);
        else {
          models.forEach(function(model){
            data.tags.push(model._id);
          });
          updateNow(data, models);
        }
      });
    }
};

希望代码反映其逻辑本身

用法:

找到Code文件后发出aCode

只需致电

checkNewTagAndSave(req.body, aCode, function(err, doc){
   //end your response as per logic
});