嗨我想要返回mongodb中数组计数小于2内部features数组的所有集合。 我尝试使用$size但这是不可能的。

我不想得到结果并循环每个features并计算它。 我想返回productId 123因为它在一个特征数组中的计数为1。 请以下文件为例:

{
    "productId" : 123.0,
    "features" : [ 
        {
            "a" : true
        }, 
        {
            "a" : true,
            "b" : true
        }
    ]
},
{
    "productId" : 456.0,
    "features" : [ 
        {
            "a" : true,
            "b" : true
        }, 
        {
            "a" : true,
            "b" : true
        }
    ]
}

#1楼 票数:3 已采纳

你实际要求的是匹配数组元素中的“键数”。 您有不同的方法,具体取决于可用的MongoDB版本。

MongoDB 3.4.4及更高版本

您可以使用$objectToArray将每个元素强制转换为“数组”本身,表示元素的“键/值”对:

db.collection.aggregate([
  { "$redact": {
    "$cond": {
      "if": {
        "$anyElementTrue": { 
          "$map": {
            "input": "$features",
            "as": "f",
            "in": {
              "$lt": [
                { "$size": { "$objectToArray": "$$f" } },
                2
              ]
            }
          }
        }
      },
      "then": "$$KEEP",
      "else": "$$PRUNE"
    }
  }}
])

你基本上用$redact来提供条件,这确定了$map的结果,其中$objectToArray应用于每个元素,然后测试$size ,其中任何测试的数组元素通过$anyElementTrue返回true

所有其他版本

在其他任何地方,看起来更简短,但实际上并不是性能有效使用$where应用JavaScript表达式来测试数组元素。 使用Object.keys()Array.some()原理相同:

db.collection.find({
  "$where": function() {
    return this.features.some(f => Object.keys(f).length < 2 )
  }
})

同样的交易,但由于JavaScript需要对每个文档进行解释和评估,因此它实际上比给定的聚合表达式运行得慢一些。

两者都返回相同的文档,即在内部对象中具有“少于两个键”的元素的文档,就像问的那样:

/* 1 */
{
    "productId" : 123.0,
    "features" : [ 
        {
            "a" : true
        }, 
        {
            "a" : true,
            "b" : true
        }
    ]
}

  ask by KristCont translate from so

未解决问题?本站智能推荐:

1回复

在 Mongo DB 中的数组内查找重复值,但它可以存在于对象之外

我想要一个查询,该查询将为我提供serialNumber 值重复的用户名。 一个库中的序列号值可以存在于其他用户名库中,但不应存在于某个特定用户名库中
2回复

将mongo db查询减少为纯数组

当我运行db.abhishek.em.find({})我有 我想通过添加或链接某些东西来查找函数来将结果简化为一个简单的对象ID数组,例如db.abfind({employed:true})。somefunction()这样的函数,它可以返回以下我想使用的数组在较大的查询中嵌套有$ in
2回复

如何根据Mongodb中的条件删除重复项?

我有 100 万个类似这种格式的文档,我如何根据“memberId”删除重复的文档。 我需要删除“generatedId”值不包含“-”的重复文档。 在此示例中,应删除底部文档,因为它在“generatedId”值中不包含“-”。 有人可以分享任何想法如何做到这一点。
1回复

为数组字段的每个元素计算数学公式-Mongodb Aggregation Framework

我有一个包含数组字段的集合,其中包含一些元素值,如下所示: 我必须进行聚合以计算myArrayField的每个元素的权重: 通过这种聚合,我得到了一个新的字段权重,每个元素的权重值X。 我的问题是这个X的计算。 这个著名的权重X是一个需要累加和的数学公式,您将在下面看到
1回复

计算数组和无限子数组中的所有对象

每次出现键“文本”都将被视为注释(因此有4条注释)。 在Mongo上获得成功的最好方法是什么?
1回复

如何从另一个Array MongoDB中的一个数组计算匹配元素

我正在使用MongoDB Aggregate框架来查询用户集合。 这是下面的用户架构布局的示例: 这是聚合管道中概述的步骤。 1:使用$ geoNear运算符在指定距离内定位用户。 2:根据性别匹配用户。 我想要做的是传递另一个用户的personalAttrib
1回复

MongoDB中来自数组数组的项目元素

我目前正在努力搜索导入到MongoDB罗盘中的JSON文件中的数组数组。 在下面的代码中,您可以看到数组“ track”包含多个其他数组。 现在,我想获取每个数组的第四个值,例如,我想从第一个数组获取“ load”,从第二个数组获取“ mouseover”,依此类推... 我很高兴在
1回复

作为 MonogoDB 数组中的键,值如何成为值?

说明:我想将值转换为键的一部分,在文档 1 中将"xyz"替换为v ,在文档 2 中将"abc"替换为v 。 注意:有多个文档,我不知道文档 3 的“sig_nam”值可能是什么。 1号文件 2号文件 预期输出文件编号 1 预期产出文件 2