2016-06-01 5 views
3

вот моя схема:Как выбрать конкретное поле в гнездовой заселить в mogoose

var UserSchema = new Schema({ 
    email: String, 
    name: String, 
    city: String, 
    username: String, 
    profilePic: String, 
    phoneNo: Number, 
    shortList: { 
     project: [{ type: Schema.ObjectId, ref: "Project" }], 
     flat: [{ type: Schema.ObjectId, ref: "Flat" }], 
    }, 

}); 

var FlatSchema = new Schema({ 
    project: { type: Schema.ObjectId, ref: "Project" }, 
    status: String, 
    floor: Number, 
    size: String, 
    type: String, 
    flat_number: String, 
    price: Number, 
    flooringType: String, 
    createdAt: { type: Date, 'default': Date.now }, 
    isDeleted: { type: Boolean, 'default': false }, 
    }); 

var ProjectSchema = new Schema({ 
    name: String, 
    shortName: String, 
    developer: { type: Schema.ObjectId, ref: "Developer" }, 
    address: { 
     street_address: String, 
     city: String, 
     state: String, 
     pin: Number, 
     position: { 
      lat: Number, 
      long: Number 
     } 
    }, 
    ofcAddress: { 
     street_address: String, 
     city: String, 
     state: String, 
     pin: Number, 
    }, 

    overview: { 
     size: String, 
     area: String, 
     configuration: String, 
     possession_starts: Date, 
     info: String, 
     aminities: [{ type: Schema.ObjectId, ref: "Amenity" }] 
    }, 
    images: { 
     hdpi: String, 
     xhdpi: String, 
     web: String, 
     mdpi: String 
    }, 

}); 

здесь пользователь связь с плоской модели shortList.flat и плоской модели является связь с проект

сейчас я пытаюсь выбрать все детали следующим образом:

User.findById(req.params.id) 
     .populate('shortList.project', { 'CalculationsRules': 0, 'KBFlatTypeCharges': 0, 'CategoryPremia': 0, 'Floor': 0, 'KBUnitType': 0, 'floorplans': 0, 'flats': 0, 'towers': 0, 'galaryImages': 0 }) 
     .populate('shortList.flat', { 'pricedetails': 0 }) 
     .exec((err, user) => { 
      if (err) { return handleError(res, err); } 
      if (!user) { return res.json(401); } 
//here i want to select specific field from project model 
      User.populate(user, { path: 'shortList.flat.project', model: 'Project' }, (err, user) => { 
       res.status(200).json(user); 
      }) 
     }); 

его работает нормально, но я хочу, чтобы выбрать некоторые конкретные поля образуют модель проекта, как имя и изображения

ответ

14

Использование выберите свойство в заселить как:

User.populate(user, { path: 'shortList.flat.project', model: 'Project', select: 'name' }) 

Это даст вам имя проекта только.

Чтобы дать указать поля, которые вы не хотите, вы можете обнулить как:

User.populate(user, { path: 'shortList.flat.project', model: 'Project', select: { 'name': 0, 'Floor': 0, 'flats': 0, 'towers': 0,} } 

Это работает для меня.

и если вы делаете две популяции уровня:

мы можем просто сделать это как:

populate('project.tower', 'name project flats'); 

для простых Заселите, чтобы получить конкретную feilds:

populate('project', 'name') 
+0

Thank s! это то, что мне нужно! – John

0

попытаться сделать это:

applicantListToExport: function (query, callback) { 
    this 
    .find(query).select({'advtId': 0}) 
    .populate({ 
     path: 'influId', 
     model: 'influencer', 
     select: { '_id': 1,'user':1}, 
     populate: { 
     path: 'userid', 
     model: 'User' 
     } 
    }) 
    .populate('campaignId',{'campaignTitle':1}) 
    .exec(callback); 
    }