我正试图抓住用户的高分榜。为此,我查询Post
模型,在帖子中找到user._id
作为author
的帖子。
这很好用。
但是,我只想抓住帖子的_id
和voteCount
。由于某些原因,添加select
只会引发错误并说它是unprocessable entity
以下是查询:
getHighscorePost(req, res, next) {
const firebaseUID = req.params.uid;
User.findOne({ firebaseUID })
.select('_id')
.then(user => {
Post.find({ author: user._id })
.select('_id, voteCount')
.sort({ voteCount: -1 })
.limit(1)
.then(post => res.send(post[0]))
.catch(next);
})
.catch(next);
}
我已尝试在每个select
和limit
选项之前/之后添加sort
。
如果我省略select
,那么帖子控制台就会像这样记录好;
{ _id: '589ddffeb4a1477fa04d632a',
author: '589ddffeb4a1477fa04d6326',
text: 'This is post two. It belongs to Matt too',
createdAt: 2,
expiresAt: 1000000000000000000,
university: 'University of Aberdeen',
voteCount: 3,
uniOnly: false,
__v: 0,
categories: [ 'music' ],
votes: [],
commenters: [],
comments: [],
expired: false,
commentCount: 0,
id: '589ddffeb4a1477fa04d632a' }
添加select
后,我的身体一无所获。错误返回:
{ error: 'Cannot read property \'length\' of undefined' }
这里发生了什么?
谢谢
答案 0 :(得分:2)
答案 1 :(得分:1)
默认情况下应包含_id
。你可以尝试:
.select('voteCount')
答案 2 :(得分:1)
你可以使用
Post.find({ author: user._id }, {voteCount: 1})
你不需要把_id = 1,因为默认情况下它会在输出中,但是如果你不想在你的输出中使用_id,你应该把_id = 0。
以下是完整的代码:
getHighscorePost(req, res, next) {
const firebaseUID = req.params.uid;
User.findOne({ firebaseUID })
.select('_id')
.then(user => {
Post.find({ author: user._id }, {voteCount: 1})
.sort({ voteCount: -1 })
.limit(1)
.then(post => res.send(post[0]))
.catch(next);
})
.catch(next);
}
希望它应该可以正常工作但无论如何,请告诉我这是否有效。