2016-06-11 2 views
7

Это мои схемы (тема является родителем и содержит список «Мысль-х):Populate Вложенного массив в мангуст - Node.js

var TopicSchema = new mongoose.Schema({ 
    title: { type: String, unique: true }, 
    category: String, 
    thoughts: [ThoughtSchema] 
}, { 
    timestamps: true, 
    toObject: {virtuals: true}, 
    toJSON: {virtuals: true} 
}); 

var ThoughtSchema = new mongoose.Schema({ 
    text: String, 
    author: {type: mongoose.Schema.Types.ObjectId, ref: 'User'}, 
    votes:[{ 
    _id:false, 
    voter: {type: mongoose.Schema.Types.ObjectId, ref: 'User'}, 
    up: Boolean, 
    date: {type: Date, default: Date.now} 
    }] 
}, { 
    timestamps: true, 
    toObject: {virtuals: true}, 
    toJSON: {virtuals: true} 
}); 

.... 

Я пытаюсь прочитать автор Замысла и изменить ПОЛУЧИТЬ тему апи например:

... 
    var cursor = Topic.find(query).populate({ 
    path: 'thoughts', 
    populate: { 
     path: 'author', 
     model: 'User' 
    } 
    }).sort({popularity : -1, date: -1}); 

    return cursor.exec() 
    .then(respondWithResult(res)) 
    .catch(handleError(res)); 
... 

Но автор пуст. Я также не получаю ошибок в консоли. Что здесь не так?

Редактировать: На самом деле мне не нужна мысль как схема, у нее нет собственной коллекции в базе данных. Он будет сохранен в разделах. Но для того, чтобы использовать опцию timestamps с мыслями, мне нужно было извлечь ее содержимое в новую локальную схему ThoughtSchema. Но я теперь определил содержимое мыслиSchema непосредственно в массиве мыслей тем, но он все еще не работает.

Редактировать 2: Это объект-указатель перед его выполнением. К сожалению, я не могу отлаживать в WebStorm, это скриншот из инспектора узла:

enter image description here

+0

@ Theodore ответ выглядит правильно для меня: что такое контент 'query'? У вас есть 'select' в нем? – pasine

+0

Я загрузил скриншот содержимого объекта курсора перед его исполнением – akcasoy

ответ

0

Как насчет

Topic.find(query).populate('thoughts') 
.sort({popularity : -1, date: -1}) 
.exec(function(err, docs) { 
    // Multiple population per level 
    if(err) return callback(err); 
    Topic.populate(docs, { 
    path: 'thoughts.author', 
    model: 'User' 
    }, 
    function(err, populatedDocs) { 
    if(err) return callback(err); 
    console.log(populatedDocs); 
    }); 
}); 
+0

nope :(....... – akcasoy

0

ли вы попробовать использовать Model.populate?

Topic.find(query).populate('thoughts') 
.sort({popularity : -1, date: -1}) 
.exec(function(err, docs) { 
    // Multiple population per level 
    if(err) return callback(err); 
    Thought.populate(docs, { 
    path: 'thoughts.author', 
    model: 'User' 
    }, 
    function(err, populatedDocs) { 
    if(err) return callback(err); 
    console.log(populatedDocs); 
    }); 
}); 

UPDATE:
Вы можете попробовать с deep populate, как это:

Topic.find(query).populate({ 
    path: 'thoughts', 
    populate: { 
    path: 'author', 
    model: 'User' 
    } 
}) 
.sort({popularity : -1, date: -1}) 
.exec(function(err, docs) { 
    if(err) return callback(err); 
    console.log(docs); 
}); 
+0

«Мысль» не экспортируется. Я также не знаю, как экспортировать несколько схем ... Это единственная строка экспорта: экспорт по умолчанию mongoose.model ('Topic', TopicSchema); – akcasoy

+0

Вам не нужно экспортировать его, поскольку вы используете его в качестве встроенной схемы. В этом случае я подтверждаю, что ответ Theodore должен работать. проверьте свою базу данных? Правильно ли указана ссылка на 'author'? – pasine

+0

да .. поле автора имеет идентификатор пользователя. Но я каким-то образом не смог отладить код на стороне сервера в webstorm, чтобы увидеть, как выглядит запрос. попробуйте отладить в следующие дни. Но о схеме «Мысль» .. когда я использую Thought.populate, как вы предлагаете, приложение не может быть скомпилировано .. sth вроде «Мысль не определена» появляется в терминале – akcasoy

0

Эти схемы:

var TopicSchema = new mongoose.Schema({ 
    title: { type: String, unique: true }, 
    category: String, 
    thoughts: [ThoughtSchema] 
}, { 
    timestamps: true, 
    toObject: {virtuals: true}, 
    toJSON: {virtuals: true} 
}); 

var ThoughtSchema = new mongoose.Schema({ 
    text: String, 
    author: {type: mongoose.Schema.Types.ObjectId, ref: 'User'}, 
    votes:[{ 
    _id:false, 
    voter: {type: mongoose.Schema.Types.ObjectId, ref: 'User'}, 
    up: Boolean, 
    date: {type: Date, default: Date.now} 
    }] 
}, { 
    timestamps: true, 
    toObject: {virtuals: true}, 
    toJSON: {virtuals: true} 
}); 

ли вы пытаетесь Aggregation Вместо заселить. Агрегат Упрощает заполнение встроенных данных с помощью $lookup. Попробуйте приведенный ниже код.

ОБНОВЛЕНИЕ

Topic.aggregate([{$unwind: "$thoughts"},{ $lookup: {from: 'users', localField: 'thoughts.author', foreignField: '_id', as: 'thoughts.author'}},{$sort:{{popularity : -1, date: -1}}}],function(err,topics){ 
console.log(topics) // `topics` is a cursor. 
// Perform Other operations here. 
}) 

Объяснение:

$ размотать: деконструирует поле массива из входных документов для вывода документа для каждого элемента.

$ lookup: Этап $ lookup выполняет сопоставление равенства между полем из входных документов с полем из документов «объединенной» коллекции. Поиск выполняет работу населения.

$ поиск работает как

из: это говорит о том, из которого сбор потребности в данных заселяться (users в этом сценарии)..

localField: это локальное поле, которое необходимо заполнить. (thoughts.author в этом случае).

foreignField: это поле внешнего присутствуют в коллекции, из которой данные должны быть заполнены (_id поля в users коллекции в этом сценарии).

как: это поле как то, что вы хотите отобразить объединенное значение как. (это проецирует id мысли.автора как документ мысли.автор).

Надеюсь, что это сработает.

+0

«Вы пытались Агрегация вместо заполнения» Извините ... Но агрегат обычно используется с «match» вместо «find», насколько я знаю .. поэтому это не альтернатива для заполнения, но чтобы «найти», я думаю .. поэтому я не знаю, как интегрировать это в мой код. Агрегат возвращает также объект курсора, который должен быть выполнен впоследствии? Не могли бы вы обновить мой второй код в вопросе и написать все строки? – akcasoy

Смежные вопросы