我有文档文件夹的以下模式:
var permissionSchema = new Schema({
role: { type: String },
create_folders: { type: Boolean },
create_contents: { type: Boolean }
});
var folderSchema = new Schema({
name: { type: string },
permissions: [ permissionSchema ]
});
Run Code Online (Sandbox Code Playgroud)
因此,对于每个页面,我可以拥有许多权限.在我的CMS中有一个面板,我列出了所有文件夹及其权限.管理员可以编辑单个权限并保存.
我可以使用其权限数组轻松保存整个Folder文档,其中只修改了一个权限.但我不想保存所有文档(真正的架构有更多字段)所以我这样做:
savePermission: function (folderId, permission, callback) {
Folder.findOne({ _id: folderId }, function (err, data) {
var perm = _.findWhere(data.permissions, { _id: permission._id });
_.extend(perm, permission);
data.markModified("permissions");
data.save(callback);
});
}
Run Code Online (Sandbox Code Playgroud)
但问题是烫发总是未定义的!我尝试以这种方式"静态地"获取权限:
var perm = data.permissions[0]; …Run Code Online (Sandbox Code Playgroud) 我刚刚开始使用猫鼬.我有一个带有mongoose的创建脚本,它使用示例数据创建模式和数据库.
现在我写实际的应用程序.每次我的应用程序运行时是否需要创建模式对象,或者它是否已经以某种方式提供?
换句话说,我是否需要在每个使用mongoose访问数据库的应用程序中运行此代码,或者只是第一次:
var Comments = new Schema({
title : String
, body : String
, date : Date
});
Run Code Online (Sandbox Code Playgroud)
如果我有setter/validations/etc,答案会怎样改变?
IN nodejs,mongodb,mongoosejs as orm
我这样做
我有一个模型,用户
User.findOne({username:'someusername'}).exec(function(err,user){
console.log(user) //this gives full object with something like {_id:234234dfdfg,username:'someusername'}
//but
console.log(user._id) //give undefined.
})
Run Code Online (Sandbox Code Playgroud)
为什么?那么如何让_id变为字符串呢?
我有一堆记录,我需要得到最新的(最近的)和最老的(最近的).
谷歌搜索我发现这个主题,我看到了几个问题:
// option 1
Tweet.findOne({}, [], { $orderby : { 'created_at' : -1 } }, function(err, post) {
console.log( post );
});
// option 2
Tweet.find({}, [], {sort:[['arrival',-1]]}, function(err, post) {
console.log( post );
});
Run Code Online (Sandbox Code Playgroud)
不幸的是他们都错了:
TypeError: Invalid select() argument. Must be a string or object.
Run Code Online (Sandbox Code Playgroud)
链接也有这个:
Tweet.find().sort('_id','descending').limit(15).find(function(err, post) {
console.log( post );
});
Run Code Online (Sandbox Code Playgroud)
那一个错误:
TypeError: Invalid sort() argument. Must be a string or object.
Run Code Online (Sandbox Code Playgroud)
那么我该如何获得这些记录呢?
更理想的是,我只想要最旧和最新记录之间的时间差异(秒?),但我不知道如何开始这样的查询.
这是架构:
var Tweet = new Schema({
body: String …Run Code Online (Sandbox Code Playgroud) 在我的models/user.js档案中:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var userSchema = new Schema({
(define schema)
});
...
(save user)
...
(check password)
...
mongoose.model('User', userSchema);
Run Code Online (Sandbox Code Playgroud)
在我router/index.js,我有:
var mongoose = require('mongoose');
var User = mongoose.model('User');
Run Code Online (Sandbox Code Playgroud)
抛出错误:
MissingSchemaError: Schema hasn't been registered for model "User".
Run Code Online (Sandbox Code Playgroud)
但是,如果user.js,我(在最后一行)
module.exports = mongoose.model('User', userSchema);
Run Code Online (Sandbox Code Playgroud)
在index.js我这样做var User = require('../models/User');,然后一切正常.
但它不应该,因为config/pass.js我正在做,var User = mongoose.model('User');而且它的工作完美无瑕.
该require('../models/User');语法不工作在Ubuntu,但在我的Mac.
我该怎么办?我如何解决它?我看了很多样本应用程序,包括MEAN,但没有什么是真正有用的.
此处的文档并没有对为什么有两种不同的操作来完成相同的事情提供太多解释,所以我想知道它们之间有什么区别。为什么我可以选择使用一种而不是另一种?
要修改mongoose中现有条目中的字段,使用之间有什么区别
model = new Model([...])
model.field = 'new value';
model.save();
Run Code Online (Sandbox Code Playgroud)
还有这个
Model.update({[...]}, {$set: {field: 'new value'});
Run Code Online (Sandbox Code Playgroud)
我问这个问题的原因是因为有人建议我昨天发布的一个问题:NodeJS和Mongo - 当多个用户同时发送请求时出现意外行为.这个人建议使用更新而不是保存,我还不完全确定它为什么会有所作为.
谢谢!
我有一个Mongoose User模型:
var User = mongoose.model('Users',
mongoose.Schema({
username: 'string',
password: 'string',
rights: 'string'
})
);
Run Code Online (Sandbox Code Playgroud)
我想找到一个User模型实例,修改它的属性,并保存更改.这是我试过的(这是错的!):
User.find({username: oldUsername}, function (err, user) {
user.username = newUser.username;
user.password = newUser.password;
user.rights = newUser.rights;
user.save(function (err) {
if(err) {
console.error('ERROR!');
}
});
});
Run Code Online (Sandbox Code Playgroud)
查找,修改和保存User模型实例的语法是什么?
.findOne()我将 Mongoose 更新到最新版本(6.0.1),现在每当执行时都会收到此错误:
MongooseError: Query was already executed: Streams.findOne({ i: 6 })
at model.Query._wrappedThunk [as _findOne] (C:\Users\honza\ZiggerTestMaster\node_modules\mongoose\lib\helpers\query\wrapThunk.js:21:19)
at C:\Users\honza\ZiggerTestMaster\node_modules\kareem\index.js:370:33
at processTicksAndRejections (node:internal/process/task_queues:78:11)
at runNextTicks (node:internal/process/task_queues:65:3)
at listOnTimeout (node:internal/timers:526:9)
at processTimers (node:internal/timers:500:7) {
originalStack: 'Error\n' +
' at model.Query._wrappedThunk [as _findOne] (C:\\Users\\honza\\ZiggerTestMaster\\node_modules\\mongoose\\lib\\helpers\\query\\wrapThunk.js:25:28)\n' +
' at C:\\Users\\honza\\ZiggerTestMaster\\node_modules\\kareem\\index.js:370:33\n' +
' at processTicksAndRejections (node:internal/process/task_queues:78:11)\n' +
' at runNextTicks (node:internal/process/task_queues:65:3)\n' +
' at listOnTimeout (node:internal/timers:526:9)\n' +
' at processTimers (node:internal/timers:500:7)'
}
Run Code Online (Sandbox Code Playgroud)
我的代码如下:
var visitorData = Visitor.find({});
app.get("/retrieve", function(req,res){
visitorData.exec(function (err,data) {
if (err) { …Run Code Online (Sandbox Code Playgroud) 我对这种select方法的使用感到很困惑.这就是我使用它的方式,这是错误的:
Transaction.find({username : user.username}).select('uniqueId', 'confirmation_link', 'item_name', 'timeout', 'username', function(err, txs){
callback(txs);
});
Run Code Online (Sandbox Code Playgroud)
我想要实现的只是从数据库中的事务中选择具有该用户名的事务,我想只取出select方法中列出的字段.任何人都可以指出我应该如何使用该select方法?谢谢.