MongoDB:使用OR条件查找带有附加列的查询,以标记记录对应的条件

时间:2014-08-08 10:50:08

标签: mongodb aggregation-framework

我需要使用以下OR查询从表中获取某些记录

db.book.find({
    "$or" : [ 
        { "_id': ObjectId("53e49ab8fdc5c42d13965e85")},
        { "topics": { "$in" : ["mysql","MongoDB"] }} 
    ]
})

我需要在最终输出中标记结果以显示记录的来源,即记录是第一个条件还是第二个条件。怎么做?

修改

发布解决方案(在菲利普的帮助下)

2 个答案:

答案 0 :(得分:2)

带有aggregation framework$cond operator可以为您提供帮助。

聚合的第一步是与您在上面的查找中使用的相同对象的$匹配。第二步将是一个$ project,它使用$ cond运算符生成一个新的字段foundBy,它取决于文档的_id是否与查询中的_id匹配而得到不同的值。

$project: {
    // fields from original document you want to retain unchanged:
    any: 1,
    field: 1,
    you: 1,
    need: 1,
    // a new, computed field:
    foundBy: { 
        $cond: {
           if: {$eq: [ "$_id", ObjectId("53e49ab8fdc5c42d13965e85") ] },
           then: "id match",
           else: "topic match"
        }
    }
}

答案 1 :(得分:0)

db.tbook.aggregate(
{ 
   "$match": {
      "$or": [
        { "_id": ObjectId("53e49ab8fdc5c42d13965e85") },
        {"topics": { "$in" : ["mysql","MongoDB"]}} 
      ]
   } 
},
{ 
   "$project": { 
    "intersect": { 
        $setIntersection: [ "$topics", ["mysql","MongoDB"] ] 
     } 
   } 
},
{ 
   "$project": {
     foundBy: { 
        $cond: {
           if: { $eq : [ "$intersect", [] ] },
           then: "id match",
           else: "topic match"
        }
     }
   }
}
)