如何确保$in子句中的所有项在MongoDB中返回匹配项?

如何确保$in子句中的所有项在MongoDB中返回匹配项?,mongodb,Mongodb,我正在处理一组文档,如下所示: { name : "BCC 204", //etc } 我有一个要映射到其DB条目的名称列表 例如: var names = [ "BCC 204", "STEW 101", "SMTH 123" ] 我想提出这样一个问题 db.labs.find( { name : { $in: names } } ); 但是操作符中的$in不能确保名称数组中的每个项都与数据库中的结果匹配 (更多信息,名称是唯一的)您不能在查询中执行此操作 中的$将检查

我正在处理一组文档,如下所示:

{
    name : "BCC 204", 
    //etc
}
我有一个要映射到其DB条目的名称列表

例如:

var names = [ "BCC 204", "STEW 101", "SMTH 123" ]
我想提出这样一个问题

db.labs.find( { name : { $in: names } } );
但是操作符中的
$in不能确保名称数组中的每个项都与数据库中的结果匹配


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

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


更简单地说,查询匹配构成结果集的文档-它们不匹配结果集。

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


更简单地说,查询匹配构成结果集的文档-它们与结果集不匹配。

目前,我对每个项目都提出了单独的请求,这显然很慢,因此,如果我不能在数据库中完成所有操作,这是我的另一个选择。您仍然可以执行一个查询来返回所有与这些名称匹配的文档,但在应用程序中,您应该验证每个查询项是否存在于结果集中。答案和注释完全正确,但由于OP提到名称是唯一的,如果
names
数组中的值与0或1个文档匹配,而不与任何其他数目的文档匹配,然后您就知道,每个项都与db中的一个结果匹配,如果(并且仅当)
names.length==db.labs.count({“name”:{“$in”:names}})
。一旦一个
名称
值存在于多个文档中,您就失去了这一保证,因此您需要非常小心地维护名称的唯一性(可能有唯一索引)。目前,我对每个项目分别提出请求,这显然很慢,因此,如果我不能在数据库中完成所有操作,这是我的另一个选择。您仍然可以执行一次查询以返回所有与这些名称匹配的文档,但您应该在应用程序中验证每个查询项是否存在于结果集中。答案和注释完全正确,但是由于OP提到名称是唯一的,如果
names
数组中的一个值与0或1个文档匹配,并且从不与任何其他数量的文档匹配,那么您确实知道,如果(并且仅当)
names.length==db.labs.count({“name”:{“$in”:names})
,每个项都与db中的一个结果匹配。一旦一个
name
值存在于多个文档中,您就失去了这种保证,因此您需要非常小心地维护名称的唯一性(可能有唯一索引)。