日期数组的 MongoDB 过滤器查询返回空数组

标签 mongodb mongodb-query aggregation-framework

我有一个 MongoDB 文档,其中包含有关产品及其变体的信息,结构示例如下。

{
    "site_id": 3,
    "status": 2,
    "tags": [],
    "title": "WORTHBUY Bento Lunch Box for Kids, 2 Compartments Stainless Steel Square Lunch Box with Portable Cutlery, Portion Control Food Storage Container Leakproof, BPA Free(Pink)",
    "total_sold_count": 3,
    "amount_of_variations": 3,
    "variations": [{
            "price": 9.66,
            "shipping_price": 0,
            "quantity": 0,
            "sold_count": 1,
            "sold_dates": [
                ISODate("2020-03-03T17:00:00.000-07:00")
            ]
        },
        {
            "price": 18.42,
            "shipping_price": 0,
            "quantity": 0,
            "sold_count": 1,
            "sold_dates": [
                ISODate("2020-03-03T17:00:00.000-07:00")
            ]
        },
        {
            "price": 18.42,
            "shipping_price": 0,
            "quantity": 0,
            "sold_count": 1,
            "sold_dates": [
                ISODate("2020-03-03T17:00:00.000-07:00"),
                ISODate("2020-03-09T20:30:56.000-06:00")
            ]
        }
    ]
}

我正在尝试获取在特定日期之后售出的所有变体。为此,我使用了以下 mongo 聚合查询,但在结果中,我得到了一个空的变体列表。

db.products.aggregate([{
    $match: {
        "variations.sold_dates": {
            $gt: ISODate("2020-03-05 00:00:00")
        }
    }
}, {
    $addFields: {
        "variations": {
            $filter: {
                input: "$variations",
                as: "variations",
                cond: {
                    $and: [{
                        $gt: ["$$variations.sold_dates", ISODate("2020-03-05 00:00:00")]
                    }]
                }
            }
        }
    }
}])

此查询适用于除此日期列表之外我尝试过的所有其他字段。知道我做错了什么吗?

最佳答案

由于 variations.sold_dates 是一个日期数组,您不能比较给定日期是否大于 sold_dates。因此,您需要迭代 variations.sold_dates 数组的每个元素并检查是否大于 while 迭代,因为 $filter 返回一个过滤器元素数组,然后您可以检查大小该数组 > 0 以将变体对象添加到 $addFields 中的变体数组。试试这个查询:

db.collection.aggregate([
  {
    $match: {
      "variations.sold_dates": {
        $gt: ISODate("2020-03-05T00:00:00Z")
      }
    }
  },
  {
    $addFields: {
      "variations": {
        $filter: {
          input: "$variations",
          as: "variation",
          cond: {
            $gt: [
              {
                $size: {
                  $filter: {
                    input: "$$variation.sold_dates",
                    cond: {
                      $gt: [
                        "$$this",
                        ISODate("2020-03-05T00:00:00.000Z")
                      ]
                    }
                  }
                }
              },
              0
            ]
          }
        }
      }
    }
  }
])

测试: MongoDB-Playground

关于日期数组的 MongoDB 过滤器查询返回空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60518581/

相关文章:

mongodb - 如何在mongodb中检索整数ObjectID

MongoDB 搜索 : exact match and diacritic insensitivity (avoid tokenizer)

javascript - 使用其他字段的数据创建 ID

mongodb - 如何从同一个表中选择相关事件?

javascript - 如何按条件从输出中删除不需要的字段

javascript - MongoDB聚合通用求和和按唯一键求和

node.js - mongodb/mongoose findMany - 查找 ID 列在数组中的所有文档

angularjs - 在 MEAN 堆栈中实现权限级别的最佳方法是什么?

mongodb - 为什么 Mongoose 删除我数据库中最上面的项目,而不是与目标项目匹配的 id?

mongodb - Mongo在计算条件下排序