为什么MongoDB $lt查询返回的文档不包括正在查询的字段?

lstz6jyr  于 2023-11-17  发布在  Go
关注(0)|答案(1)|浏览(157)

此问题在此处已有答案

MongoDB comparison operators with null(1个答案)
昨天就关门了。
我有以下形式的项目集合:

{ 
    # random fields here
    events: [
        ... 
        { 
            # random fields here...
            last_update_submitted: some date
        }
    ]
}

字符串
我正在尝试查询集合,以寻找 events 数组中最后一个事件的 last_update_submitted 日期超过30天前的所有文件。到目前为止,我已经撰写这个汇总查询:

[
  {
    $project: {
      events: "$events",
      last_event: {
        $last: "$events",
      },
      thirty_days_ago: {
        $dateSubtract: {
          startDate: new ISODate(),
          unit: "day",
          amount: 30
        }
      }
    },
  },
  {
    $match: {
      $expr: {
        $lt: [
          "$last_event.last_update_submitted",
          "$thirty_days_ago"
        ],
      },
    },
  },
]


问题是,查询不仅返回具有与条件匹配的最后事件的文档,而且返回具有完全不包含 last_update_submitted 字段的最后事件的文档。因此,在我的示例中,如果 last_update_submitted 日期大于30天前,则正确地返回该日期。如果该日期小于30天前,但即使最后一个事件根本不包含 last_update_submitted 字段,它也会被返回。
这是预期的行为吗?如果是,建议的处理方法是什么?我应该先检查字段是否存在吗?

3mpgtkmj

3mpgtkmj1#

这里有一个解决方案,它突出了$ifNull的功能,并使用$let设置变量,以便评估只发生一次。

db.foo.aggregate([
    {$project: {
        X: {$let: {
            vars: {
                e:{$last:'$events'},
                t:'$$NOW'  // capture point in time                              
            },
            in: {$cond: [
                // IF last_update_submitted is null OR ABSENT, call the value    
                // $$NOW which clearly is NOT more than 30 days ago:             
                {$lt:[ {$ifNull:["$$e.last_update_submitted","$$t"]},
                       {$dateSubtract: {startDate: '$$t', unit: "day",amount: 30}} ]},

                // THEN if older than 30 days, emit the whole object:      
                "$$e",

                // ELSE emit null                                                
                null
            ]}
        }}
    }},

    //  Exclude all the nulls:                                                   
    {$match: {X: {$ne: null}}}
]);

字符串

相关问题