Mongoose, खोज के साथ एक विशिष्ट क्षेत्र का चयन करें


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

लेकिन मेरी प्रतिक्रिया में मैं भी _id प्राप्त कर रहा हूं, मेरे दस्तावेज़ स्कीमा में केवल दो फ़िसेल, _id और नाम हैं

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

क्यों???

जवाबों:


201

_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
@ होंगरक .find({}, 'name -_id')काम नहीं कर रहा है?
शनिका एडिरीवेरा

एक मान के बिना मान प्राप्त करने का एक तरीका है जैसे ['value1', 'value2', 'value3'] के बजाय ['name': 'value1', 'name': 'value2', 'name': '
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एक साथ -। पूर्व के लिए "-name"दूसरा तर्क में होगा नहीं शामिल 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 ', फ़ंक्शन (
इरेट

1
कई क्षेत्रों में केवल 'नाम' के बजाय ['नाम', 'फ़ील्ड 2', 'फ़ील्ड 3', 'आदि'] होंगे
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 उपयोक्ता

यहां सूचीबद्ध वस्तुओं की सूची को वापस नहीं किया जाएगा / मुद्रित किया जाएगा।


आप इसे कैसे ढूंढते हैं?
जीरो_कोल

प्रश्नावली नाम json सरणी पर की जरूरत है। आपकी विधि के साथ अन्य कुंजी भी हैं जैसे कि वे भी उम्र की तरह आएंगे, आदि
रतन उदय कुमार

बहुत बढ़िया, बस मैं क्या देख रहा था
तेजा

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()कि नए mongodbऔर nodejsड्राइवर के साथ कर्सर विधि का उपयोग किया जाए ।

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

3
.project()केवल समुच्चय के साथ काम करता है। यदि आप इसे find({},{ name: 1, _id: 0 })विधि में दूसरे तर्क का उपयोग करना चाहते हैं ।
शाम

नए मोंगोडब नोड ड्राइवर के साथ आपको इस तरह का उपयोग नहीं करना है। लेकिन आम के साथ आप दूसरे तर्क का उपयोग कर सकते हैं।
आषाढ़

1
आह, यह नोडजेएस चालक में है।
शाम 14

समझ में क्यों नहीं आता है, लेकिन नए संस्करणों में @Anony सही है ... निचले संस्करण आप इसे इस तरह से कर सकते हैं ... बहुत गन्दा
ackuser

2

उदाहरण के लिए,

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

0 का मतलब है उपेक्षा

1 का मतलब शो है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.