我需要使用以下OR查询从表中获取某些记录
db.book.find({
"$or" : [
{ "_id': ObjectId("53e49ab8fdc5c42d13965e85")},
{ "topics": { "$in" : ["mysql","MongoDB"] }}
]
})
我需要在最终输出中标记结果以显示记录的来源,即记录是第一个条件还是第二个条件。怎么做?
修改
发布解决方案(在菲利普的帮助下)
答案 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"
}
}
}
}
)