2015-01-08 5 views
3

Я играю с Mongoose, и у меня проблемы с сохранением массива. Например, у меня есть поле ввода на странице для разделенных запятыми тегов. Я хватаю их из req.body.tags, удаляю пустое пространство и разделяю их запятыми, чтобы получить массив тегов. Теперь, как мне сохранить этот массив обратно в мою базу данных? Я предполагаю, что я неправильно определил эту часть схемы, но я не уверен, что правильно, если честно. Схема у меня до сих пор:Сохранение массива (из «тегов») в MongoDB с использованием Mongoose

var postSchema = mongoose.Schema({ 
    title: String, 
    permalink: String, 
    content: String, 
    author: { 
    id: String, 
    name: String, 
    }, 
    postDate: { 
    type: Date, 
    default: Date.now 
    }, 
}); 

Если бы я был, чтобы сохранить метки (от должности, например) было бы лучше, чтобы иметь массив с именем метки, а затем каждый тег имеет имя (и идентификатор?)? Если да, добавлю ли я что-то вроде этого (ниже) к схеме? Идея добавления тегов в сообщение заключается в том, что я могу отображать их (как ссылки) в сообщении и иметь возможность искать базу данных для всех сообщений с определенным тегом. Правильно ли это?

tags: [{ 
    name: String, 
    id: String 
}] 

При размещении в нового маршрута после, я делаю следующее:

post = new Post(req.body); 
    tags = req.body.tags.replace(/\s/g,'').split(','); 
    // maybe post.tags = tags ?  
    post.save(function(err) { 
    if (!err) { 
     res.redirect('/posts'); 
    } else { 
     ... 
    } 
    }); 

Это успешно сохраняет все другие поля, представленные (название, автор, содержание и т.д.), но я «Не знаю, как я могу сохранить только что созданные теги вернуться к базе данных. Любой совет здесь был бы очень желанным, поскольку я новичок в этом и очень хочу продолжать учиться. Благодаря!

ответ

4

Если вы действительно хотите, чтобы ваша «метка» массив, чтобы иметь поле имени и сгенерированный _id поля затем определить другую схему и вставлять его:

var tagSchema = mongoose.Schema({ 
    name: String 
}); 

var postSchema = mongoose.Schema({ 
    title: String, 
    permalink: String, 
    content: String, 
    author: { 
    id: String, 
    name: String, 
    }, 
    postDate: { 
    type: Date, 
    default: Date.now 
    }, 
    tags: [tagSchema] 
}); 

Затем манипулирует ввод в правильную структуру, прежде чем создать Post объект:

req.body.tags = req.body.tags.replace(/\s/''/g).split(",").map(function(tag) { 
    return { "name": tag }; 
}); 

var post = new Post(req.body); 

Или просто оставить его как массив простых строк:

var postSchema = mongoose.Schema({ 
    title: String, 
    permalink: String, 
    content: String, 
    author: { 
    id: String, 
    name: String, 
    }, 
    postDate: { 
    type: Date, 
    default: Date.now 
    }, 
    tags: [String] 
}); 

И не беспокойтесь о том, отображающая свойства объекта:

req.body.tags = req.body.tags.replace(/\s/''/g).split(","); 
var post = new Post(req.body); 
+0

Спасибо за (принят) ответ, Нил. Я не знал, что вы можете внедрить другую схему. –

+0

Он отлично работает, но мне пришлось использовать '.replace (/ \ s/g, '')'. – wag0325

+0

Ждать вы не можете сделать ObjectID вместо всей схемы? http://mongoosejs.com/docs/populate.html –

Смежные вопросы