MongoDB:$all 带有空数组...

aft*_*eep 5 find mongodb

我正在对包含此类文档的集合运行查询。

{"name": "Daniel", "tags": ["person", "owner", "father"]},
{"name": "Jane", "tags": ["person", "owner", "mother"]},
{"name": "Jimmy", "tags": ["person", "owner", "son"]}
Run Code Online (Sandbox Code Playgroud)

现在,如果我想查找与标签人和所有者匹配的所有文档,我会这样做

var match = ['person', 'owner'];
model.find({'tags': {$all: match}});
Run Code Online (Sandbox Code Playgroud)

现在我需要执行以下操作:

  1. 当匹配有值时,返回与这些值匹配的所有文档(已完成)
  2. 当match为空[]时,返回所有文档。

在单个查询中执行此操作的最有效方法是什么?

提前致谢,

D

Bat*_*eam 2

我建议您在应用程序层添加条件,并使query在服务器上执行的条件保持非常简单。

  • 如果match数组有一个或多个元素,请向您的查询添加一个查询字段condition,否则执行一个空条件,这将返回所有文档。

片段:

var match = ['person', 'owner'];
var condition = {};
if(match.length > 0){
   condition["tags"] = {$all:match};
}
db.model.find(condition);
Run Code Online (Sandbox Code Playgroud)

话虽如此,使用$all运算符,不可能在单个查询中实现这两个条件。

$all 运算符选择字段值为包含所有指定元素的数组的文档。

  • 令人惊讶的是 model.find({'tags': {$all: []}})` 没有返回所有文档(假设标签在每个文档中以空数组形式存在)。 (3认同)