抓取所有mongodb查询的值

时间:2015-05-18 14:20:26

标签: mongodb mongoose

我想知道是否有一个可以在Mongodb的搜索查询中使用的全能值,它将返回数据库中的所有条目?

给出一个“故事”模型,我知道找到所有故事的代码是“Story.find({})。exec()”。我正在努力弄清楚的是,如果我需要传递一个参数 - > “Story.find({termId:someValue})。exec()”,是否有一个像我所能传递的所有someValue,它会返回所有条目?

我需要找到这个的原因是我试图重载以下函数,在某些情况下,我会传递一个termId并希望限制搜索,而在另一种情况下,我会调用someFn一个参数,并希望它返回所有条目。

Q.all功能代码相对复杂,我宁愿不把它分成if-else块

function someFn(termId) {
   Q.all([Q.nbind(..., Story.find({termId: termId}).exec()...]).spread()}
}


// Not so elegant solution I'm trying to avoid
function someFn(termId) {
  if (typeof termId === 'undefined'){
    Q.all([Q.nbind(..., Story.find({}).exec()...]).spread()}
  }
  else {
    Q.all([Q.nbind(..., Story.find({termId: termId}).exec()...]).spread()}
  }
}

3 个答案:

答案 0 :(得分:3)

不,您没有可用于匹配任何termId值的通配符值,但您可以通过以编程方式构建查询对象来使其更易于管理:

 
function someFn(termId) {
  var query = {};
  if (typeof termId !== 'undefined'){
    query.termId = termId;
  }
  Q.all([Q.nbind(..., Story.find(query).exec()...]).spread()}
}

答案 1 :(得分:1)

您可以将termId查询值设置为{$exists: true}作为默认设置,然后在您的功能中覆盖。

因此,默认情况下,您的查询将如下所示:

{termId: {$exists: true}}

将返回所有已定义termId字段的文档,这些文档将成为所有文档。只要您传递另一个值,它就会覆盖{$exists: true}并按预期工作。

答案 2 :(得分:0)

这可以通过在 mongodb 查询中使用三元运算符来解决。

以下是我用来根据国家/地区搜索用户的示例。它允许您根据搜索词查询特定国家或所有国家的数据库。这也可以进行缩放以相应地添加额外条件。

let {country} = req.body

const students = await studentModel.find({country: country === 'all' ? {$exists: true} : country })