MongoDb只返回数组形式的特定字段(电话号码)

时间:2016-02-13 09:10:15

标签: mongodb mongoose mongodb-query

我想以数组的形式查询并获取我的一个架构中的所有电话号码。

我的架构是

 var doctorSchema = new Schema({
      profile: {
        fullname: String,
        gender: String,
        email: String,
        dob: Date,
        contact: 
        { mobile: String },
        } 
        });

有人可以帮助我如何仅查询contact.mobile并将所有数字存储在数组中?

我尝试了$ map但它不起作用。

2 个答案:

答案 0 :(得分:1)

使用distinct

尝试
db.doc.distinct('profile.contact.mobile')

对于那些样本数据

{ "_id" : ObjectId("56bef5f4d43b2f3239759505"), "profile" : { "fullname" : "DJ", "email" : "hhh.com", "contact" : { "mobile" : "123456" } } }
{ "_id" : ObjectId("56bef605d43b2f3239759506"), "profile" : { "fullname" : "ad", "email" : "gg.com", "contact" : { "mobile" : "127886" } } }

结果是

[ "123456", "127886" ]

答案 1 :(得分:1)

您可以使用点表示法在模型上调用 distinct() 方法来指定嵌入的文档字段。这将查询单个集合中指定字段的所有不同值,并以数组形式返回结果:

var callback = function (err, result) {
    if (err) { /* handle err */ };
    console.log('unique mobile numbers', result);
};

Doctor.distinct("profile.contact.mobile", callback);

var query = Doctor.distinct("profile.contact.mobile");
query.exec(callback);

在mongo shell中,这相当于:

var mobilenumbers = db.doctors.distinct("profile.contact.mobile");

您还可以在查询返回的 map() 上使用 promise 方法,作为将结果输入数组的另一种方法:

var promise = Doctor.find({ }).select("profile.contact.mobile").exec();
promise.then(function (results) {
    var numbers = results.map(function (m) {
        return m.profile.contact.mobile;
    });
    console.log(numbers);
}).then(null, function (err) {
    console.log(err);
});

mongo shell等效操作使用map()游标方法,如下:

var mobilenumbers = db.doctors.find({}, {"profile.contact.mobile": 1})
                              .map(function (m){ 
                                   return m.profile.contact.mobile; 
                              });