猫鼬无法从MongoDB数据库获取数据

时间:2019-01-07 07:34:23

标签: javascript mongodb mongoose

我有一个下面的模型(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'

获取空数据可能是什么问题?我在此上浪费了很多时间。

4 个答案:

答案 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,其中猫鼬将createdAtupdatedAt字段分配给架构,并且分配的类型为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
})