2017-10-16 27 views
-1

我想console.log()mongodb数据库查询的结果,而不进入mongo shell。以下是我的代码。相关部分以粗体显示。如何将mongodb数据库查询记录到控制台(而不是mongo shell)?

router.put('/quotes/:id', (req, res, next) => { 
    let personToUpdate = req.params.id; 
    **console.log("old name: " + JSON.stringify(db.collection("quotes").findOne({ _id: ObjectId(personToUpdate) })));** 
    db.collection("quotes").findOneAndUpdate( 
    { _id: ObjectId(personToUpdate)}, 
    {$set: { 
     name: req.body.name 
     } 
    }, function (err, object) { 
     if (err) { 
     console.warn(err.message); 
     } else { 
     **console.log("new name: " + req.body.name);** 
     } 
    } 
); 
}); 

我曾尝试:

console.dir(),但该返回[对象,对象。 我试过print()和printjson(),但那些都是mongo shell独占命令。

最终结果应该是,当用户通过put请求更改名称时,首先将存储在数据库中的旧名称记录到控制台,然后在findOneAndUpdate()mongodb命令的末尾进行更改该名称记录了用户通过req.body.name提交的新名称

+0

为什么记录异步调用的结果? – lilezek

+0

我不明白为什么这是一个问题。记录(“新名称:”+ req.body.name)工作得很好。我的困难是在进行更改之前获取当前存储在数据库中的旧名称的日志。 –

+0

请阅读'findOne'如何工作:http://mongodb.github.io/node-mongodb-native/2.2/api/Collection.html#findOne –

回答

2

findOne是异步的,所以您需要提供回调以获取结果,然后将其余代码放在该回调中因此只有在获得原始文档后才能进行更新。

但是,默认情况下,原始文档被传递给findOneAndUpdate回拨,因此您可以消除findOne调用并从那里获取原始名称。

router.put('/quotes/:id', (req, res, next) => { 
    let personToUpdate = req.params.id; 
    db.collection("quotes").findOneAndUpdate( 
    { _id: ObjectId(personToUpdate)}, 
    {$set: { 
     name: req.body.name 
     } 
    }, function (err, result) { 
     if (err) { 
     console.warn(err.message); 
     } else { 
     console.log("old name: " + result.value.name); 
     console.log("new name: " + req.body.name); 
     } 
    } 
); 
}); 
+0

你真不可思议!非常感谢! –

相关问题