如何以编程方式强制 mongoose 查询并返回 mongodb 集合中的某个字段?

Posted

技术标签:

【中文标题】如何以编程方式强制 mongoose 查询并返回 mongodb 集合中的某个字段?【英文标题】:How to programmatically force mongoose to query and return a certain field in a mongodb collection? 【发布时间】:2017-04-14 10:45:34 【问题描述】:

我有一个密码和盐存储在 mongodb 中,我可以查询除盐以外的所有其他字段。

这是架构:

var userSchema = new Schema(
firstname     :  type: String, trim: true,
lastname      :  type: String, trim: true,
email         :  type: String, required: true, unique: true, trim:true,
password      :  type: String, required: true,
salt          :  type: String, required: true, trim: true, unique: true,
addedOn       :  type: String, required: false
);
...

还有这里的文档请求:

User.findOne(
    email: req.body.email   
).exec(function(err, obj) 
    if (err) 
        console.log("MongoDB Error: " + err);
        return res.status(500); // or callback
     
    else if (obj) 
        console.log(obj.firstname); //This works
        console.log(obj.salt); // And this doesn't
    
);

但是当我从终端运行 db.users.find() 时,这个文档存在并且有盐。

编辑:

我在这里找到了我的问题的解决方案How to protect the password field in Mongoose/MongoDB so it won't return in a query when I populate collections?

【问题讨论】:

【参考方案1】:

使用这个你可以强制 mongoose 从 mongodb 集合中查询并返回某个字段:

User.findOne(
 email: req.body.email  
,
 firstname: 1, lastname: 1 , email: 1, password: 1, addedOn: 1).exec(function(err, obj) 
if (err) 
console.log("MongoDB Error: " + err);
 return res.status(500); // or callback
 
else if (obj) 
console.log(obj);
);

【讨论】:

【参考方案2】:

我喜欢 Mital 的回答,它检索字段但由于某种原因返回的值不可用。

这相当有效。

User.findOne(
     email: req.body.email 
).select('+salt').exec(function(err, obj)
 ... 

【讨论】:

以上是关于如何以编程方式强制 mongoose 查询并返回 mongodb 集合中的某个字段?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式将IAsyncOperation强制为错误状态?

我如何以编程方式将IAsyncOperation强制为错误状态?

如何以编程方式创建展开转场[重复]

解构第一个 Array 项或如何强制 Mongoose 返回 Object 而不是 1-item Array

查询子文档并从中选择过滤后的数据 Mongoose

如何以编程方式强制 EGORefreshTableHeaderView 更新