Mongodb $匹配使用$ addFields添加的字段

时间:2018-02-21 16:55:54

标签: mongodb

如何将我刚刚在$ 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发布了自己的解决方案。解决方案类似,但问题的表达方式不同

1 个答案:

答案 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)但是我将使用这个解决方案,因为还没有预见到迁移