2017-10-19 6 views
2

쿼리 옵션이 몽둥이 populate인데 왜 쿼리 옵션이 작동하지 않는지 알 수 없습니다.비동기 폭포로 쿼리 옵션 채우기

나는 사용자 스키마를 가지고 :

const mongoose = require('mongoose'); 
const Schema = mongoose.Schema; 

const UserSchema = new Schema(
    { 
    username: { type: String, required: true }, 
    email: { type: String }, 
    name: { type: String }, 
    address: { type: String } 
    }, 
    { timestamps: true } 
); 
module.exports = mongoose.model('User', UserSchema); 

및 공급 스키마

async.waterfall([ 
    function(callback) { 
    User 
     .findOne({ 'username': username }) 
     .exec((err, result) => { 
     if (result) { 
      callback(null, result); 
     } else { 
      callback(err); 
     } 
     }); 
    }, 

    function(userid, callback) { 

    // find user's feed 
    Feed 
     .find({}) 
     // .populate('user', {_id: userid._id}) <== this one also doesn't work 
     .populate({ 
     path: 'user', 
     match: { '_id': { $in: userid._id } } 
     }) 
     .exec(callback); 
    } 
], function(err, docs) { 
    if (err) { 
    return next(err); 
    } 

    console.log(docs); 
}); 
:

나는 모든 feed user에 의해 ID를 찾으려면
const mongoose = require('mongoose'); 
const Schema = mongoose.Schema; 

const FeedSchema = new Schema(
    { 
    user: { type: Schema.ObjectId, ref: 'User' }, 
    notes: { type: String, required: true }, 
    trx_date: { type: Date }, 
    status: { type: Boolean, Default: true } 
    }, 
    { timestamps: true } 
); 

FeedSchema.set('toObject', { getters: true }); 

module.exports = mongoose.model('Feed', FeedSchema); 

, 나는 다음과 같은 코드 async waterfall를 사용

위 코드를 사용하면 피드가 모두있는 것처럼 보입니다. 쿼리 옵션이 전혀 작동하지 않습니다, 내가 잘못 했나요?

도움을 주시면 감사하겠습니다.

답변

2

_id의 값이 "이전"으로 채워지는 "user" 속성에 이미 저장된 값인 경우 "이후"채우기와 일치하는 이유를 잘 모릅니다. 그냥 새에 _id 속성을 원하는, 그래서 .findOne() 전체 문서를 반환 물론 마음에

async.waterfall([ 
    (callback) => 
    User.findOne({ 'username': username }).exec(callback), 

    (user, callback) => { 
    if (!user) callback(new Error('not found')); // throw here if not found 
    // find user's feed 
    Feed 
     .find({ user: user._id }) 
     .populate('user') 
     .exec(callback); 
    } 
], function(err, docs) { 
    if (err) { 
    return next(err); 
    } 

    console.log(docs); 
}); 

상태 유지 : 이와 같이

는 정말 대신 .find()에 단순한 "쿼리"상태입니다 질문. 또한 초기 폭포 기능에서의 "저글링"은 필요하지 않습니다. 오류가 있으면 최종 콜백에 "빨리 실패"하거나 그렇지 않은 경우 결과를 전달합니다. 대신 다음 방법으로 "찾을 수 없음"을 찾습니다.

User.aggregate([ 
    { "$match": { "username": username } }, 
    { "$lookup": { 
    "from": Feed.collection.name, 
    "localField": "_id", 
    "foreignField": "user", 
    "as": "feeds" 
    }} 
]).then(user => /* User with feeds in array /*) 
: 당신이 MongoDB를가 지원하는 곳 $lookup를 사용

User.findOne({ "username": username }) 
.then(user => Feed.find({ "user": user._id }).populate('user')) 
.then(feeds => /* do something */) 
.catch(err => /* do something with any error */) 

또는 참 : "Promises" 얼마 동안 주변되었습니다 그리고 당신이 정말로 그들을 사용해야하기 때문에 물론

정말 필요하지 않습니다이

출력이 약간 다른데 실제로 약간의 조작으로 동일하게 보이도록 변경할 수는 있지만 일반적 아이디어가 있어야합니다.

일반적으로 서버가 여러 요청을 발행하는 대신 결합을 수행하도록하는 것이 중요합니다. 이는 대기 시간을 최소한으로 늘리는 것입니다.

+0

정말 고마워요, 이제 작동합니다. 내가 말한대로 Promises를 사용하도록 코드를 변경했습니다. – metaphor