Javascript 检查是否存在多个字段,如果不存在,则返回MongoDB中的所有项目

Javascript 检查是否存在多个字段,如果不存在,则返回MongoDB中的所有项目,javascript,mongodb,query-string,Javascript,Mongodb,Query String,很抱歉,我不能很好地表达这个标题。但我的问题是,使用查询字符串参数,我希望从Mongo集合中返回相应的已注册文档。假设我输入了以下url: myurl.com/getbooks?lang=en&cat=fiction&x=y 然后,我在options对象中将所有查询参数从客户端传递到服务器,如下所示: options = {lang: 'en', cat: 'fiction', x: 'y'} 因此,当我在服务器中收到options对象时,我将使用其字段来运行代码,以找到检索

很抱歉,我不能很好地表达这个标题。但我的问题是,使用查询字符串参数,我希望从Mongo集合中返回相应的已注册文档。假设我输入了以下url:

myurl.com/getbooks?lang=en&cat=fiction&x=y
然后,我在
options
对象中将所有查询参数从客户端传递到服务器,如下所示:

options = {lang: 'en', cat: 'fiction', x: 'y'}
因此,当我在服务器中收到
options
对象时,我将使用其字段来运行代码,以找到检索相关书籍的匹配项:

var lang = options.lang;
var cat = options.cat;
var x = options.x;

Books.find({book_language: lang, book_category: fiction, x: x })
这非常有效,除了一个非常明显的情况,即如果没有为其中一个或所有字段输入查询参数;Mongo不返回任何文档,但应返回所有文档。因为字段未定义。当然,我可以详尽地编写一个长的
if-else
函数,该函数可以处理所有可能的情况,但我有4个不同的参数,总共可以生成12个不同的场景。因此,这不是一个优雅的解决方案(但我在服务器中还要添加几个条件)


因此,我需要一个解决方案,模块化地检查是否为任何字段输入了查询,然后最终返回all,这是默认值。

这不是很优雅,也不是很快,但我认为它比编写12条if语句更好:

var obj = {a: void 0, b: 1, c: 2};
var filled = Object.keys(obj).filter(function(key) { 
  return obj[key] !== void 0;  
}); 
console.log(filled); // ["b", "c"]
if (filled.length === 3) { 
  Book.find(obj); 
}

仅供参考:当你的对象被序列化时,所有未定义的值都将被删除,留下更少的属性。你说的序列化是什么意思?这似乎是一种理想的方式,但是它在客户端上的结果是相同的……考虑<代码> var Obj= {a:未定义,b:1 };JSON.stringify(obj)=='{“b”:1}'事实上,我找到了我认为最好的方法,灵感来自你的方法。如果值未定义,为什么不在发送到服务器之前删除属性呢?嗯,实际上你的或多或少都是这样不。。。?我们可以在最后发送数组。您有一个对象*,如果您使用的是
JSON,那么在将值发送到服务器之前,这些值将被删除。stringify
-我假设您是-对您的数据进行字符串表示,然后发送到服务器。没错,现在我明白了。我明天会试试这个。现在睡着了:)谢谢@Emo一点问题都没有,我们在这里是为了相互激励:-)