【问题标题】:Mongoose 'find' is returning an empty array when queried with conditional params使用条件参数查询时,Mongoose 'find' 返回一个空数组
【发布时间】:2019-10-27 06:13:52
【问题描述】:

我收集了一些推文,我需要获取特定用户的推文。我正在使用猫鼬“查找”查询来查找推文。我从 req.params 获取 user_id 并将其用作条件参数,但 mongodb 返回一个空数组。

我已经尝试使用 console.log 进行调试,并且 user_id 似乎是正确的。 'user_id' 的类型是预期的字符串,即使我的集合中有匹配的条目,我似乎也找不到返回空数组的原因。

此外,当我使用其他条件参数(除了用户)时,可以毫无问题地获取条目。

app.get('/search/:id',(req,res) => {
  var _id = req.params.id;
  if(!users.includes(_id)){
    res.status(400)
    res.send('Sorry... User not present in the list')
  }
  else{
    Tweet.find({user: _id}).then((tweets)=>{
      res.status(200).send(tweets)
    }).catch((e) =>{
      res.status(500).send();
    })
  }
})

我的猫鼬架构:

const Tweet = mongoose.model('Tweet',{ user:{ type: String, trim:true }, text:{ type: String, required: true, trim:true }, verified:{ type: Boolean } })

【问题讨论】:

  • 代码看起来不错。您能否提供一个您希望找到的示例 id 值和 Tweet 文档?该文档在tweets 集合中,对吧?
  • 是的。我有一个集合“推文”。示例文档:{"_id":"5d0129be839e1711ca1b6d04", "user":"\"jimmyfallon\"", "text":"\"Might have to do both!!!\"", "verified":true} 我将 id 作为“用户”传递,以便返回与该用户对应的所有推文。
  • 看起来您的问题是您在匹配的字符串中嵌入了 " 字符。它应该看起来像 "user": "jimmyfallon"
  • 是的,这似乎是问题所在。我已经在搜索查询中添加了“”,它工作正常。谢谢。仍然困扰我的一件事是 mongodb 的行为。我的“用户”参数是字符串类型,而 mongodb 正在将“”添加到我的输入内容中。这是正常的 mongodb/mongoose 行为吗?
  • Mongodb 不会添加那些“”,它们一定来自其他地方

标签: node.js mongodb express mongoose


【解决方案1】:

“我已经尝试使用 console.log 进行调试,并且 user_id 似乎是正确的。'user_id' 的类型是预期的字符串,我似乎没有找到返回空数组的原因,即使有我收藏中的匹配条目。” 根据您的此声明,您搜索“user_id”是文档,但您无法在 mongoose 架构中定义 user_id

const Tweet = mongoose.model('Tweet',{
  user:{
    type: String,
    trim:true
  },
  text:{
    type: String,
    required: true,
    trim:true
  },
  verified:{
    type: Boolean
  }
})

使用用户而不是 id

app.get('/search/:user',(req,res) => {
  var user = req.params.user;
  if(!users.includes(user)){
    res.status(400)
    res.send('Sorry... User not present in the list')
  }
  else{
    Tweet.find({user: user}).then((tweets)=>{
      res.status(200).send(tweets)
    }).catch((e) =>{
      res.status(500).send();
    })

  }
})

【讨论】:

  • findById() 将只返回 1 个文档,就像 findOne() 一样。我需要所有具有用户的文档:req.params.id。
  • 我认为你需要一个文档,所以如果你需要使用所有文档,我建议使用 findById() 方法,然后使用 find() 方法
  • 另一个问题是您在架构中定义 user_id,当您将数据插入文档时,mongo 会自动插入唯一的 _id。
  • 正如我所提到的,我需要获取特定于特定用户的推文。我在这里的查询是条件参数 ({user: _id}) 似乎在这里不起作用并返回一个空数组。理想情况下,它应该返回一个包含 user: _id 的所有文档的数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
  • 1970-01-01
  • 2017-11-13
  • 2019-11-30
  • 2019-04-27
相关资源
最近更新 更多