我有一个下面的模型(AccountModel.js)和它的控制器。我尝试使用邮递员更改一个文档,但是尽管有数据,但我从数据库事件中得到一个空数组。
let mongoose = require('mongoose')
let Schema = mongoose.Schema
var ObjectId = Schema.ObjectId
let mySchema = mongoose.Schema({
account_id:ObjectId,
account_key:String,
message:String,
created_at:Date,
updated_at:Date
})
let MySchema = module.exports =
mongoose.model('account',mySchema);
module.exports.get = function(callback,limit){
MySchema.find(callback).limit(limit)
}
和下面的AccountController来管理帐户数据库。我已经控制了查询和数据库的输出。
var mongoose = require('mongoose')
var Account = require('../models/AccountModel')
var ObjectId = mongoose.Types.ObjectId;
exports.setMessage = function(req,res){
query = {account_id:new ObjectId(req.body.acnt_id)}
console.log(query,"...")
Account.find(query,function(err,account_data){
if(err){
res.send(err)
}
else{
try{
console.log(account_data,'setWelcomeMessage')
account_data.message =
req.body.welcomeMessage
account_data.updated_at = new Date()
account_data.save((err,data)=>{
if(err){
console.log(err)
res.send(err)
}
res.send({"Status":"Success"})
})
res.send({"Status":"Success"})
}
catch(e){
//console.log(e)
res.send({"Status":"Failed"})
}
}
})
}
下面是数据库
> db.account.find().pretty()
{
"_id" : ObjectId("5c18fea5c5a6a4ebf7999c0b"),
"account_id" : ObjectId("5c18fbefc5a6a4ebf7999c08"),
"account_key" : "UDS1500",
"message" : "testing message",
"created_at" : ISODate("2018-12-18T14:05:25.637Z"),
"updated_at" : ISODate("2018-12-18T14:05:25.637Z")
}
{
"_id" : ObjectId("5c18feffc5a6a4ebf7999c0c"),
"account_id" : ObjectId("5c18fbaac5a6a4ebf7999c07"),
"account_key" : "UDS1299",
"message" : "testing message2",
"created_at" : ISODate("2018-12-18T14:06:55.968Z"),
"updated_at" : ISODate("2018-12-18T14:06:55.968Z")
}
从POSTMAN呼叫后,我得到一个空数组
下面是请求格式
{
"acnt_id":"5c18fbaac5a6a4ebf7999c07",
"welcomeMessage":"test message 3!!"
}
控制台如下
{ account_id: 5c18fbaac5a6a4ebf7999c07 } '...'
[] 'setWelcomeMessage'
获取空数据可能是什么问题?我在此上浪费了很多时间。
答案 0 :(得分:2)
罪魁祸首是这条线
query = {account_id:new ObjectId(req.body.acnt_id)}
其中的语句new ObjectId(req.body.acnt_id)
创建了一个新ID(无论您在构造函数中传递了什么),因此查询失败,因为数据库中没有任何匹配项。当猫鼬在幕后为您执行此操作时,您不一定需要将acnt_id
字符串强制转换为ObjectId
,但是如果需要,请使用
query = {account_id:mongoose.Types.ObjectId(req.body.acnt_id)}
否则
query = {account_id:req.body.acnt_id}
就足够了。
一种更好的更新方法是使用findOneAndUpdate
方法,该方法对模型进行原子更新,通常在您要更新数据库中的单个文档并将其返回给应用程序时使用,因此您可以将控制器方法重构为:
exports.setMessage = (req, res) => {
const query = { 'account_id': req.body.acnt_id };
const update = {
'$set': {
'message': req.body.welcomeMessage,
'updated_at': new Date(),
}
};
const options = { 'new': true };
Account.findOneAndUpdate(query, update, options, (err, account_data) => {
if (err){
res.send(err)
}
else {
console.log(account_data); // logs the updated account document
res.send({"Status":"Success"})
}
});
}
此外,您可以在架构中设置timestamps,其中猫鼬将createdAt
和updatedAt
字段分配给架构,并且分配的类型为Date
,即
let mySchema = mongoose.Schema({
account_id: ObjectId,
account_key: String,
message: String,
}, { timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' } });
答案 1 :(得分:0)
.find()返回一个数组,而不是单个元素。因此,我建议改用.findOne()方法。
答案 2 :(得分:0)
感谢您的回复。我找到了解决问题的答案。
原因是猫鼬创建了具有复数名称的模型。这就是说,我在这里将模型命名为“帐户”。但是在数据库中,它将创建/连接到名称为“ accounts”的集合。我不知道猫鼬不创建/连接到名为“帐户”的集合的原因。由于没有用“帐户”命名的集合,因此总是给我空的结果。
最后,我将集合名称更改为“帐户”。现在可以正常工作了。
请评论原因,猫鼬创建/连接到给定模型的复数名称。
答案 3 :(得分:-1)
//getting from postman .... give the account id in postman
query = {account_id:req.body.acnt_id};
//there is match in DB--- getting the data
Account.find(query,function(err,account_data){
if(err){
res.send(err)
}
u wana update
else{
Accoun.update({account_id:req.body.acnt_id},req.body
};
//on body what you enter in postman that will update and store on DB
IN MY KNOWLEDGE
// just example
Model.update
Updates all documents matching conditions using the update clause. All update values are casted to their appropriate types before being sent.
var conditions = { name: 'bourne' }
, update = { $inc: { visits: 1 }}
, options = { multi: true };
Model.update(conditions, update, options, callback);
function callback (err, numAffected) {
// numAffected is the number of updated documents
})