マングース、検索で特定のフィールドを選択


121

特定のフィールドのみを選択しようとしています

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の2つのフィールドしかありません。

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

なぜ???

回答:


200

_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')
hong4rc

3
@Hongarc .find({}, 'name -_id')は機能していないようですか?
Shanika Ediriweera

['name': 'value1'、 'name': 'value2'、 'name'の代わりに['value1'、 'value2'、 'value3']のようなobjなしで値を直接取得する方法がありますか? '
value3

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"、2番目の引数にはドキュメント内のフィールドが含まれませんがnameここで示す例では、返されたドキュメント内のフィールドのみが含まれnameます。


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)
user2180794

1
複数のフィールドは、 'name'だけではなく['name'、 'field2'、 'field3'、 'etc']になります
Eray T

24

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/

注意:

var usersProjection

ここにリストされているオブジェクトのリストは返されません/印刷されません。


findOneでこれをどのように行いますか?
zero_cool 2018

名前json配列に関するアンケートが必要です。あなたの方法では、他のキーは年齢のように来るよりもそこにあります
Ratan Uday Kumar

すばらしい、まさに私が探していたもの
Teja

9

DBデータ

[
  {
    "_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()新しいとカーソルの方法をmongodbnodejsドライバ。

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

3
.project()集計でのみ機能します。findで使用する場合は、find({},{ name: 1, _id: 0 })メソッドの2番目の引数を使用します。
シャム

いいえ、新しいmongodbノードドライバでは、この方法を使用する必要があります。しかし、マングースでは2番目の引数を使用できます。
Ashh

1
ああ、それはnodejsドライバーにあります。
シャム

理由はわかりませんが、新しいバージョンでは@Anthonyが正しいです...それよりも低いバージョンでは、この方法でそれを行うことができます...非常に厄介です
ackuser

2

例えば、

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

0は無視を意味します

1はショーを意味します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.