2015-03-31 19 views
0

我有这样一组文档工作:

{ 
    name : "BCC 204", 
    //etc 
} 

我有我想要映射到自己的数据库条目名称的列表。

例如:

var names = [ "BCC 204", "STEW 101", "SMTH 123" ] 

,我想作出这样

db.labs.find({ name : { $in: names } }); 

$in运营商不保证名阵列中的每个项目一个数据库中的结果相匹配的查询。

(更多信息,名称是唯一的)

回答

4

您不能在查询中执行此操作。 $in将检查文档是否与给定数组中的至少一个条目匹配,但是它不会考虑整个结果集。这是您需要在应用程序中管理的问题。给定输入列表,您需要检索结果,然后检查given_names - results.map(:name)是否为空。

简而言之,查询匹配组成结果集的文档 - 它们与结果集不匹配。

+0

目前我正在为每个项目提出单独的请求,显然很慢,所以这是我的另一种选择,如果我不能在数据库中完成所有操作。 – Vidia 2015-03-31 21:29:58

+1

您仍然可以执行一个查询以返回与这些名称中的任何一个匹配的所有文档,但验证每个查询的项目是否存在于结果集中是您应该在应用程序中执行的操作。 – 2015-03-31 21:42:17

+0

答案和评论是完全正确的,但由于OP提到名称是唯一的,如果'names'数组中的值与0或1个文档相匹配并且不匹配任何其他数量的文档,那么您确实知道每个项目都匹配结果在db if(并且只有)'names.length === db.labs.count({“name”:{“$ in”:names}})''。只要一个'name'值存在多个文档中,就失去了这个保证,所以你需要非常小心地保持名称的唯一性(可能有唯一的索引)。 – wdberkeley 2015-04-01 16:54:33

相关问题