gpt4 book ai didi

node.js - Mongoose 插入多对一

转载 作者:太空宇宙 更新时间:2023-11-04 00:55:40 24 4
gpt4 key购买 nike

我需要帮助!我正在使用 nodejs 和 mongo 创建一个网站以供学习。

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

代码模型:

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"
}
]

我将其填充到数据库中,我不知道如何插入它,有什么方法可以自动使用 Mongoose 来做到这一点,或者我需要自己创建?我正在使用这个 json 进行测试:

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

无论我是否有 id,我都需要插入标签。我需要创建它还是有办法自动创建它?我该怎么做?

对不起我的英语=x

最佳答案

一般来说,使用 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 存储为单独的集合,因此您需要在插入新的代码文档之前获取/创建任何字符串值标记。然后,您可以使用新的标记文档代替代码文档的字符串值。这将创建一个您可以使用的异步流 Promises (在较新的 Node 版本中可用)进行管理。

// 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);
});

关于node.js - Mongoose 插入多对一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29969926/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com