【问题标题】:Mongo Aggregate JS 'every' equivalentMongo Aggregate JS'每个'等价物
【发布时间】:2021-12-30 17:36:02
【问题描述】:

我正在使用aggregate,并且我想在Document 中添加一个Boolean property,如果Document 上的subArray 中的所有属性都为真。

在下面的示例中...CONFLICTS 是一个 Docs 子数组,每个包含一个名为 ResolvedBoolean property。我只想添加一个新的 allResolved 字段,以查看是否解决了所有冲突。

所以..在我的addFields 阶段,我有类似的东西

 {
   '$project': {
      'allResolved': {
        '$allElementsTrue': '$CONFLICTS.resolved'
      }, 
    }
  }

所以 JS 等价于 const allResolved = CONFLICTS.every(conflict => conflict.resolved)

但这似乎总是返回 true 这是不正确的

【问题讨论】:

  • $allElementsTrue 如果数组的所有元素都为真,则返回真,并且您的查询似乎没问题,请检查此example
  • 是的,查询似乎很好,JS 端的 Red Herring 是我看到误报的地方。谢谢!
  • 啊,极端情况是conflicts 可能不存在,或者它的文档可能不包含resolved 属性。如果是这种情况,它将始终返回 true。我们该如何解释呢?谢谢!

标签: javascript mongodb aggregation-framework


【解决方案1】:

查询

  • 这会进行额外检查
  • 检查为数组
  • 不为空数组
  • 并且每个成员都为真(缺失和空值将是假的)

Test code here

aggregate(
[{"$set":
  {"allResolved":
   {"$and":
    [{"$isArray":["$conflicts"]},
     {"$not":[{"$eq":["$conflicts", []]}]},
     {"$reduce":
      {"input":"$conflicts",
       "initialValue":true,
       "in":
       {"$and":[{"$eq":["$$this.Resolved", true]}, "$$value"]}}}]}}}])

【讨论】:

    猜你喜欢
    • 2021-05-24
    • 2015-04-12
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2011-08-22
    • 2021-12-21
    • 2019-04-04
    • 1970-01-01
    相关资源
    最近更新 更多