有一个coll包含多个文档的集合,具有以下方案:
{
"_id" : ObjectId(someId),
sourceId: someId,
"objArr" : [
{
"fieldA" : someValue,
"fieldB" : someValue
},
{
"fieldA" : someValue,
"fieldB" : someValue
},
...etc
]
}
有必要按如下方式进行选择:知道,从数组sourceId中获取字段的值fieldA和那个对象,其中两个字段都满足条件,例如,通过使用索引的标准方法,即 不使用例如。fieldBobjArr(fieldA <= С и fieldB >= С)$where
另外:在现实生活中,这可能看起来像是一项任务,即确定一组给定时期中的某个实体是否具有包含我们需要的日期的时期。
补充:当然,在后端解决这个问题并不难,因为sourceId我们可以很容易地得到整个文档,我们总是可以遍历数组并得到一个特定的对象,但我想知道mongoDB是否可以立即返回什么你需要。
或者它在概念上是错误的,或者它真的需要在后端完成,或者以平面形式存储数据,其中没有对象数组作为文档字段,并且每个这样的对象将是文档中的 2 个字段,对于一是sourceId集合中的文档数量与对象数量一样多。
如果数组只包含一个匹配的文档,那么最佳性能选项是一个简单的
find()查询。但要使其起作用,您需要使用运算符$elemMatch进行过滤。当然,运算符
$限制了从数组中的选择,只返回与查询匹配的第一个元素。如果数组中有许多匹配查询的匹配文档,为了从数组中选择所有元素,您需要使用
aggregate(). 这里有两个选项,具体取决于 MongoDB 版本。让我们先看看最好的选择。MongoDB 3.2+
MongoDB 2.6+
解释:
第一个
aggregate()请求非常简单。要过滤文档,您必须使用运算符$filter。第二个选项需要更多解释:这里我们使用一个运算符
$map,使用运算符,$cond您可以对数组中的每个元素进行逻辑处理,并在条件计算结果为真时返回元素,否则返回元素false。执行后生成的数组$map包含几个相等false的元素,要删除它们,请使用运算符$setDifference。如果允许聚合,则可以执行以下代码:
这个解决方案怎么样: