为什么不选择(mongoose查询)工作?

时间:2017-02-10 15:46:32

标签: javascript node.js express mongoose

我正试图抓住用户的高分榜。为此,我查询Post模型,在帖子中找到user._id作为author的帖子。

这很好用。

但是,我只想抓住帖子的_idvoteCount。由于某些原因,添加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);
  }

我已尝试在每个selectlimit选项之前/之后添加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' }

这里发生了什么?

谢谢

3 个答案:

答案 0 :(得分:2)

我认为您在选择中不需要分号。所以不要这样:

.select('_id, voteCount')

您的选择应如下所示:

.select('_id voteCount')

至少我会基于docs这么说。

答案 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);
  }

希望它应该可以正常工作但无论如何,请告诉我这是否有效。