MongoDB在find()操作中的条件投影字段

3

我有一个类似于以下的Mongo查询:

db.collection_a.find(
    {
        Time: { $gte: new Date(beginTime), $lte: new Date(endTime) },
    },
    {
        Value: 1,
        UpperBound: 1,
        LowerBound: 1,
        Time: 1,
    }
)

我希望在时间范围内,项目字段Value才会返回。对于由find查询返回的所有其他文档,我不希望结果中包含Value字段。
请问是否有实现这个要求的方法?

在查询(find())中,投影是针对整个结果集的,使用聚合框架如下所示的方式是唯一的方法。 - Danny Varod
1个回答

4
也许像这样的东西:
 db.collection.aggregate([
   {
     "$project": {
      Time: 1,
       UpperBound: 1,
       LowerBound: 1,
       "Value": {
        "$cond": [
      {
        $and: [
          {
            $lt: [
              "$Time",
              ISODate("2015-05-18T16:00:00Z")
            ]
          },
          {
            $gt: [
              "$Time",
              ISODate("2013-05-18T16:00:00Z")
            ]
          }
        ]
      },
      "$Value",
      "$$REMOVE"
    ]
     }
    }
  }
])

解释: 您可以在项目阶段的键/值对中添加$cond,并根据提供的日期范围设置相同的值,或者如果时间超出范围,则删除Value字段。 演示场

谢谢!我如何将我的初始时间查询添加到其中?例如:首先按时间过滤,然后在该结果中,根据更小的时间子集进行聚合。 - blueren
你可以添加初始的$match阶段来按时间过滤,并在下一个项目阶段中为Value字段设置较小范围(仅适用于较小范围),例如:https://mongoplayground.net/p/2BDQNa-X7sc - R2D2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接