猫鼬,使用查找选择特定字段


120

我正在尝试仅选择一个特定的领域

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"}]

为什么???

Answers:


199

_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);
    });
};

1
我认为.select这只是一个筛选器,您可以在选择.find({}, 'name -_id')

3
@Hongarc .find({}, 'name -_id')似乎不起作用?
Shanika Ediriweera '19

有没有一种方法可以直接获取值而无需使用['value1','value2','value3']这样的obj而不是['name':'value1','name':'value2','name': 'value3']
M.Amer,

66

现在有一种更短的方法:

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加上-。对于ex "-name",第二个参数将包含namedoc中的字段,而此处给出的示例将name包含返回的doc中的字段。


27
对于那些想要过滤多个字段的人,请不要用逗号分隔它们,而应使用空格:blogItemModel.find({}, 'title intro_image intro_text publish_date', function(err, blog_items){..
Starwave

1
对于那些想使用 dbSchema.Somevalue.find({userEmail:'test@test.com'},'userEmail -_id',function(err,someValue)中的
where子句的用户

1
多个字段将是['name','field2','field3','etc'],而不仅仅是“ name”
Eray T

24

在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);
    });    
}

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

注意:

var usersProjection

此处列出的对象列表将不被退回/打印。


您如何使用findOne做到这一点?
zero_cool

问卷调查需要名称json数组。与你的方法等关键有没有比他们还会像年龄等
拉坦乌代·库马尔·

太棒了,这正是我所想要的
Teja,

9

数据库数据

[
  {
    "_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"
  }
]

工作样本游乐场

链接


4

排除

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

const users = await UserModel.find({}, {
  password: 0 
});
console.log(users);

输出量

[
  {
    "_id": "5dd3fb12b40da214026e0658",
    "email": "example@example.com"
  }
]

包括

以下代码将仅检索每个文档中的电子邮件字段:

const users = await UserModel.find({}, {
  email: 1
});
console.log(users);

输出量

[
  {
    "email": "example@example.com"
  }
]

3

精确的方法是将.project()光标方法与new mongodbnodejsdriver一起使用。

var query = await dbSchemas.SomeValue.find({}).project({ name: 1, _id: 0 })

3
.project()仅适用于汇总。如果要与find一起使用,请在find({},{ name: 1, _id: 0 })method中使用第二个参数。
Sham

否,新的mongodb节点驱动程序必须使用这种方式。但是对于猫鼬,您可以使用第二个参数。
Ashh

1
嗯,它在nodejs驱动程序中。
Sham

不明白为什么,但是在新版本中@Anthony是正确的...较低的版本可以用这种方式...非常混乱
ackuser

2

例如,

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

0表示忽略

1表示显示

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.