Meteor-publish возвращает больше строк, чем требуется от MongoDB
У меня есть коллекция:
{
"_id" : "SeGtBvCT7ojF2v5x9",
"teamId" : "d74JJ9s5k6tijeQaz",
"userScores" : [
{
"userId" : "6ghphqzx9GFnvKYKY",
"scores" : 10,
"addedAt" : ISODate("2019-02-04T06:37:06.387Z")
},
{
"userId" : "56ghp45hqzx9G2dda",
"scores" : 1,
"addedAt" : ISODate("2019-02-04T06:37:19.105Z")
},
{
"userId" : "wrr3422fwefx6fFGs",
"scores" : 4,
"addedAt" : ISODate("2019-02-04T06:37:44.005Z")
}
]
}
Мне нужно вернуть 'userScores' для одного идентификатора команды и текущего идентификатора пользователя (this.userId). Так что я сделал этот метод публикации.
Meteor.publish('scoresTeamByUser', function(teamId) {
return Scores.find(
{ teamId },
{ userScores: { $elemMatch: { userId: this.userId } } }
);
});
Но в приложении метеор / реагирование я получаю (this.props.receivedScores) весь документ со всеми строками в "userScores".
export default withTracker(props => {
const scoresSubscription = Meteor.subscribe('scoresTeamByUser', props.teamId);
return {
receivedScores: Scores.findOne(),
scoresLoaded: scoresSubscription.ready()
};
})(GiveScores);
Как получить только данные для одной команды и одного пользователя, который дал оценку? Спасибо:)
2 ответа
Я проверил ваш запрос, и он работает нормально и возвращает только один объект из userScores
массив, который соответствует userId
,
Вам нужно использовать fields
фильтровать поля, которые вы хотите опубликовать.
Meteor.publish('scoresTeamByUser', function(teamId) {
return Scores.find(
{ teamId },
{ fields: { userScores: { $elemMatch: { userId: this.userId }}} }
);
});
Причина, по которой вы получаете все объекты в userScores
Массив в том, что у вас должна быть другая подписка, которая публикует всю запись. Вы можете проверить это console.log(Scores.findOne({ props.teamId}))
перед подпиской на scoresTeamByUser
издание.
Таким образом, вы должны либо найти эту публикацию и ограничить ее публикацией только баллов текущего пользователя или вашей текущей подписки, вы должны отфильтровать данные по клиентскому запросу, как показано ниже.
export default withTracker(props => {
const scoresSubscription = Meteor.subscribe('scoresTeamByUser', props.teamId);
return {
receivedScores: Scores.findOne({ teamId: props.teamId },
{ userScores: { $elemMatch: { userId: Meteor.userId() } }),
scoresLoaded: scoresSubscription.ready()
};
})(GiveScores);
Похоже, вы хотите что-то вроде этого.
Meteor.publish('scoresTeamByUser', function(teamId) {
const teamScores = Scores.find({ teamId: teamId });
const userScore = Scores.find(
{'userScores.userId': this.userId}, {'userScores.$': 1});
return [teamScores, userScore];
});