[英]How to save a large array to MongoDB using mongoose in Node.js
[英]Manipulating Mongoose/MongoDB Array using Node.js
我注意到几乎没有关于如何使用Mongoosejs处理对象数组的文档和信息。
我为用户提供以下模型/架构:
'use strict';
/**
* Module Dependencies
*/
var bcrypt = require('bcrypt-nodejs');
var crypto = require('crypto');
var mongoose = require('mongoose');
/**
* Custom types
*/
var ObjectId = mongoose.Schema.Types.ObjectId;
var userSchema = new mongoose.Schema({
email: { type: String, unique: true, index: true },
password: { type: String },
type: { type: String, default: 'user' },
facebook: { type: String, unique: true, sparse: true },
twitter: { type: String, unique: true, sparse: true },
google: { type: String, unique: true, sparse: true },
github: { type: String, unique: true, sparse: true },
tokens: Array,
profile: {
name: { type: String, default: '' },
gender: { type: String, default: '' },
location: { type: String, default: '' },
website: { type: String, default: '' },
picture: { type: String, default: '' },
phone: {
work: { type: String, default: '' },
home: { type: String, default: '' },
mobile: { type: String, default: '' }
}
},
activity: {
date_established: { type: Date, default: Date.now },
last_logon: { type: Date, default: Date.now },
last_updated: { type: Date }
},
resetPasswordToken: { type: String },
resetPasswordExpires: { type: Date },
verified: { type: Boolean, default: true },
verifyToken: { type: String },
enhancedSecurity: {
enabled: { type: Boolean, default: false },
type: { type: String }, // sms or totp
token: { type: String },
period: { type: Number },
sms: { type: String },
smsExpires: { type: Date }
},
friends: [{
friend: { type: ObjectId, ref: 'User' },
verified: { type: Boolean, default: false }
}]
});
/* (...) some functions that aren't necessary to be shown here */
module.exports = mongoose.model('User', userSchema);
这样就可以检查我在User内部定义了Friends,如下所示:
friends: [{
friend: { type: ObjectId, ref: 'User' },
verified: { type: Boolean, default: false }
}]
现在的问题是如何在Node.js脚本中添加,编辑和删除此数组?
BOTTOMLINE:如何使用Node.js和Mongoose.js处理MongoDB模式中的数组? 我是否总是必须创建Schema函数,或者可以直接访问它?
编辑(13/07/2014):到目前为止,我已经创建了一个HTTP GET,它为我提供了这样的数组:
app.get('/workspace/friends/:userid', passportConf.isAuthenticated, function (req, res) {
User.find({_id: req.params.userid}, function (err, items) {
if (err) {
return (err, null);
}
console.log(items[0].friends);
res.json(items[0].friends);
});
});
但这只会返回一个friendIds数组,但是如果我想创建某种'/ workspace / friends /:userid / del /:friendid'POST或添加POST怎么办? 我似乎无法弄清楚如何完成此工作。
您可以执行以下操作
app.get('/workspace/friends/:userid/delete/:friendId', passportConf.isAuthenticated, function (req, res) {
User.findOne({_id: req.params.userid}, function (err, user) {
if (err) {
return (err, null);
}
for (var i = 0; i < user.friends.length; i++) {
if (user.friends[i]._id === req.params.friendId) {
user.friends = user.friends.splice(i,1)
}
}
user.save(function(err, user, numAffected){
if (!err )res.json(user)
res.send('error, couldn\'t save: %s', err)
})
});
});
猫鼬文档中所说的是
“该回调将接收三个参数,如果发生错误,则为err,保存的[模型]为[模型],当在数据库中找到并更新文档时,numberAffected将为1,否则为0。
fn回调是可选的。 如果未传递任何fn并且验证失败,则将在用于创建此模型的连接上发出验证错误。”
如果需要操作数组,则应先将其转换为对象。
User.findOne({_id: req.params.userid}, function (err, user) {
if (err) {
return (err, null);
}
var user = user.toObject();
//... your code, an example =>
delete user.friends;
res.json(user);
});
问候,尼科尔斯
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.