如何将我刚刚在$ addFields阶段添加的字段用于以下$ match阶段?
这将不会返回任何结果:
db.getCollection('myCollection').aggregate([
{$addFields: { "test": ISODate("2018-02-15T03:22:21.000Z")}},
{$match: { $or: [{"timestamp":"$test"}]}}
])
这个将返回预期结果:
db.getCollection('myCollection').aggregate([
{$addFields: { "test": ISODate("2018-02-15T03:22:21.000Z")}},
{$match: { $or: [{"timestamp":ISODate("2018-02-15T03:22:21.000Z")}]}}
])
为什么在$ match阶段没有解决$ test?
修改 感谢this answer,我终于为mongdb 2.4发布了自己的解决方案。解决方案类似,但问题的表达方式不同
答案 0 :(得分:0)
我认为Veeram的答案对mongodb 3.6版有效,但我在3.4版中运行
我终于找到了这种方式,可以使用在$addFields
阶段添加的字段:
db.getCollection('myCollection').aggregate([
{$addFields: { "myDate": ISODate("2018-02-15T03:22:21.000Z")}},
{$project:{test: {$cond:[{$eq:["$timestamp", "$myDate"]},1,0]}}},
{$match: {"test": {"$eq": 1}}}
])
或$redact
阶段:
db.getCollection('myCollection').aggregate([
{$addFields: { "test": ISODate("2018-02-15T03:22:21.000Z")}},
{$redact: {$cond: [{ $eq: [ "$timestamp", "$test" ] }, "$$KEEP", "$$PRUNE"]}}
])
我不知道为什么它正在使用(addFields + project + match)和(addFields + redact)而不是(addFields + match)但是我将使用这个解决方案,因为还没有预见到迁移