Mongoose,使用find选择特定字段

Tlo*_*nXP 95 javascript mongoose mongodb node.js

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

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);
    });
};
Run Code Online (Sandbox Code Playgroud)

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

[{"_id":70672,"name":"SOME VALUE 1"},{"_id":71327,"name":"SOME VALUE 2"}]
Run Code Online (Sandbox Code Playgroud)

为什么???

Nei*_*unn 160

_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);
    });
};
Run Code Online (Sandbox Code Playgroud)

或明确地通过一个对象:

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);
    });
};
Run Code Online (Sandbox Code Playgroud)

  • @Hongarc`.find({},'name -_id')`似乎不起作用? (3认同)
  • 我认为 `.select` 只是在你得到所有这些之后选择字段的过滤器,我的建议是使用 `.find({}, 'name -_id')` (2认同)

Aka*_*ash 63

现在有一种更短的方法:

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
};
Run Code Online (Sandbox Code Playgroud)

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

  • 对于那些想要过滤多个字段的人,不要用逗号分隔它们,只是普通的空格:`blogItemModel.find({},'title intro_image intro_text publish_date',function(err,blog_items){..` (20认同)

Elv*_*inD 22

使用Mongoose中的Native 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);
    });    
}
Run Code Online (Sandbox Code Playgroud)

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

注意:

var usersProjection

此处列出的对象列表不会被退回/打印.


Nis*_*hah 12

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

示例 1:

User.find({}, { createdAt: 0, updatedAt: 0, isActive: 0, _id : 1 }).then(...)
Run Code Online (Sandbox Code Playgroud)

示例 2:

User.findById(id).select("_id, isActive").then(...)
Run Code Online (Sandbox Code Playgroud)

示例 3:

User.findById(id).select({ _id: 1, isActive: 1, name: 1, createdAt: 0 }).then(...)
Run Code Online (Sandbox Code Playgroud)


Zee*_*mad 11

排除

下面的代码将检索每个文档中除密码以外的所有字段:

const users = await UserModel.find({}, {
  password: 0 
});
console.log(users);
Run Code Online (Sandbox Code Playgroud)

输出

[
  {
    "_id": "5dd3fb12b40da214026e0658",
    "email": "example@example.com"
  }
]
Run Code Online (Sandbox Code Playgroud)

包括

下面的代码只会检索每个文档中的电子邮件字段:

[
  {
    "_id": "5dd3fb12b40da214026e0658",
    "email": "example@example.com"
  }
]
Run Code Online (Sandbox Code Playgroud)

输出

[
  {
    "email": "example@example.com"
  }
]
Run Code Online (Sandbox Code Playgroud)


Rat*_*mar 8

数据库数据

[
  {
    "_id": "70001",
    "name": "peter"
  },
  {
    "_id": "70002",
    "name": "john"
  },
  {
    "_id": "70003",
    "name": "joseph"
  }
]
Run Code Online (Sandbox Code Playgroud)

询问

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

输出:

[
  {
    "name": "peter"
  },
  {
    "name": "john"
  },
  {
    "name": "joseph"
  }
]
Run Code Online (Sandbox Code Playgroud)

工作样品操场

链接


Ash*_*shh 6

执行此操作的精确方法是将.project()游标方法与 newmongodbnodejs驱动程序一起使用。

var query = await dbSchemas.SomeValue.find({}).project({ name: 1, _id: 0 })
Run Code Online (Sandbox Code Playgroud)

  • `.project()` 仅适用于聚合。如果你想将它与 find 一起使用,请使用 `find({},{ name: 1, _id: 0 })` 方法中的第二个参数。 (4认同)