【问题标题】:How can I check field exist or not in mongo db before querying to mongodb?在查询 mongodb 之前,如何检查 mongo db 中是否存在字段?
【发布时间】:2015-06-06 07:34:32
【问题描述】:

我必须以用户输入集合名称、字段名称和字段值的方式对集合运行动态查询,并且我必须首先检查用户提供的字段名称是否存在于集合中,如果不存在则我必须运行另一个查询,如下例所示。

例如: 如果用户输入集合名称user,则字段名称为type,字段值为article。并根据参数我必须查询如下:

1) 如果集合user 中存在type 字段,我的查询将是:

query = user.find({type:'article'})

2) 如果类型不是集合user 的字段,我的查询将是:

query = user.find()

我尝试了$exists,但它不适合我。在查询之前如何使用$exists?因为我的集合、字段名称和字段值都是动态的。 以及如何检查type 字段是否存在于user 集合中?

我已经尝试了$exists 的解决方案,但我想知道是否有其他方法。

【问题讨论】:

  • node.js 使用的是哪个 mongodb 驱动程序?
  • 使用这种设计,您很可能会遇到性能问题。当您想知道该字段是否存在于集合中anywhere 时,您需要执行全集合扫描或使用索引。但是当您事先不知道您的字段名称时,您无法为每个可能的字段创建索引。这意味着您的每个查询都将对集合中的条目数具有线性性能。

标签: javascript node.js mongodb


【解决方案1】:

正如@Philipp 在他的评论中提到的那样,您一定会遇到性能问题,因为您需要在不使用索引的情况下执行全集合扫描。使用$exists,查询将返回也等于空的字段。假设您要首先查找设置了字段type 且不为空的所有记录,然后使用$ne 运算符的组合。您可以尝试的最接近的方法是获取该字段的计数,然后根据字段计数确定查询对象:

var type_count = db.user.find({"type": {$exists: true, $ne: null}}).count();
var query = (type_count > 0) ? {"type": "article"} : {};
db.user.find(query);

【讨论】:

  • 感谢您的帮助,但我有一个疑问,我可以在没有回调的情况下在 mongoose 中使用此解决方案吗?
  • 这只是 shell 中的一个例子。在猫鼬中,您当然需要在回调中添加 exec 函数,例如db.user.find(query).exec(function (err, users){ ... });
  • 谢谢你的回复,我想如果能避免回调就好了。
猜你喜欢
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2013-11-20
相关资源
最近更新 更多