Mongoose,使用 find 选择特定字段

IT技术 javascript node.js mongodb mongoose
2021-02-09 06:00:50

我试图只选择一个特定的字段

exports.someValue = function(req, res, next) {
    //query with mongoose
    var query = dbSchemas.SomeValue.find({}).select('name');

    query.exec(function (err, someValue) {
        if (err) return next(err);
        res.send(someValue);
    });
};

但是在我的 json 响应中,我也收到了 _id,我的文档架构只有两个字段,_id 和 name

[{"_id":70672,"name":"SOME VALUE 1"},{"_id":71327,"name":"SOME VALUE 2"}]

为什么???

6个回答

_id字段始终存在,除非您明确排除它。使用以下-语法执行此操作

exports.someValue = function(req, res, next) {
    //query with mongoose
    var query = dbSchemas.SomeValue.find({}).select('name -_id');

    query.exec(function (err, someValue) {
        if (err) return next(err);
        res.send(someValue);
    });
};

或者明确地通过一个对象:

exports.someValue = function(req, res, next) {
    //query with mongoose
    var query = dbSchemas.SomeValue.find({}).select({ "name": 1, "_id": 0});

    query.exec(function (err, someValue) {
        if (err) return next(err);
        res.send(someValue);
    });
};
我认为.select这只是在您获得所有这些后选择字段的过滤器,我的建议是使用.find({}, 'name -_id')
2021-03-18 06:00:50
有没有办法在没有像 [ 'value1', 'value2', 'value3' ] 这样的 obj 的情况下直接获取值而不是 [ 'name':'value1', 'name':'value2', 'name': '值3']
2021-03-19 06:00:50
@Hongarc.find({}, 'name -_id')似乎不起作用?
2021-04-02 06:00:50
我在使用这个时出错,因为显然我不能混合使用包含和拒绝。我想我应该作为参数传递给.select()唯一的这个 id 来排除它:.select({ "_id":0 })
2021-04-06 06:00:50

现在有一种更短的方法可以做到这一点:

exports.someValue = function(req, res, next) {
    //query with mongoose
    dbSchemas.SomeValue.find({}, 'name', function(err, someValue){
      if(err) return next(err);
      res.send(someValue);
    });
    //this eliminates the .select() and .exec() methods
};

如果您需要大部分Schema fields并且只想省略少数,您可以在字段前name加上-(减号)。对于"-name"第二个参数中的ex包括name文档中的字段,而此处给出的示例将name包含返回文档中字段。

对于那些想要在 dbSchema.Somevalue.find({userEmail:'test@test.com'},'userEmail -_id', function(err, someValue)
2021-03-16 06:00:50
对于那些想要过滤多个字段的人,不要用逗号分隔它们,只需空格: blogItemModel.find({}, 'title intro_image intro_text publish_date', function(err, blog_items){..
2021-03-18 06:00:50
多个字段将是 ['name', 'field2', 'field3', 'etc'] 而不仅仅是 'name'
2021-04-08 06:00:50

使用 Mongoose 中的本机 MongoDB 代码有更好的方法来处理它。

exports.getUsers = function(req, res, next) {

    var usersProjection = { 
        __v: false,
        _id: false
    };

    User.find({}, usersProjection, function (err, users) {
        if (err) return next(err);
        res.json(users);
    });    
}

http://docs.mongodb.org/manual/reference/method/db.collection.find/

笔记:

变量用户投影

此处列出的对象列表将不会返回/打印。

问卷需要名称 json 数组。用你的方法,其他关键在那里,而不是年龄等
2021-03-21 06:00:50
你如何用 findOne 做到这一点?
2021-03-28 06:00:50
太棒了,正是我要找的
2021-03-30 06:00:50

提示:0 表示忽略,1 表示显示。

示例 1:

User.find({}, { createdAt: 0, updatedAt: 0, isActive: 0, _id : 1 }).then(...)

示例 2:

User.findById(id).select("_id, isActive").then(...)

示例 3:

User.findById(id).select({ _id: 1, isActive: 1, name: 1, createdAt: 0 }).then(...)
似乎您不能再包含 0 和 1 的混合
2021-03-14 06:00:50
最合适的安全解决方案,无需任何附加功能!
2021-03-29 06:00:50

数据库数据

[
  {
    "_id": "70001",
    "name": "peter"
  },
  {
    "_id": "70002",
    "name": "john"
  },
  {
    "_id": "70003",
    "name": "joseph"
  }
]

询问

db.collection.find({},
{
  "_id": 0,
  "name": 1
}).exec((Result)=>{
    console.log(Result);
})

输出:

[
  {
    "name": "peter"
  },
  {
    "name": "john"
  },
  {
    "name": "joseph"
  }
]

工作示例游乐场

关联