Mongodb$通过比较子文档中的两个字段进行修订
我已经更新到Mongodb 2.6.1,并尝试使用新的聚合函数来解决业务问题,但没有成功。我遇到的所有$redact示例都是针对外部变量或静态值进行评估的 我需要根据同级子文档中的值删除一些结果文档。如果可能的话,我相信$redact是实现这一点的方法,但像所有技术挑战一样,我相信有几种方法可以解决。我想保持文档结构不变。如果需要,我可以在我的应用程序代码中消除额外的结果,但更希望数据正好从数据库中出来 这就是我想做的 收藏Mongodb$通过比较子文档中的两个字段进行修订,mongodb,Mongodb,我已经更新到Mongodb 2.6.1,并尝试使用新的聚合函数来解决业务问题,但没有成功。我遇到的所有$redact示例都是针对外部变量或静态值进行评估的 我需要根据同级子文档中的值删除一些结果文档。如果可能的话,我相信$redact是实现这一点的方法,但像所有技术挑战一样,我相信有几种方法可以解决。我想保持文档结构不变。如果需要,我可以在我的应用程序代码中消除额外的结果,但更希望数据正好从数据库中出来 这就是我想做的 收藏 Location.id是应用程序代码中的一个整数集,仅用于创建位置和奖
Location.id
是应用程序代码中的一个整数集,仅用于创建位置和奖励之间的关系(奖励可能仅在少数位置有效)。下面的文档已被删减,以关注此处的重要内容
{
"_id" : ObjectId("53728b24e4749ce8ac3f31e7"),
"name" : "Business name",
"locations" : [
{
"name" : "Downtown Norfolk",
"id" : 3
},
{
"name" : "McDonald's Suffolk",
"id" : 4
}
],
"rewards" : [
{
"name" : "Reward for Downtown Norfolk Only",
"locationIDs" : [3]
}
]
}
查询
我需要制作的是每个奖励及其适用位置的列表。我可以使用下面的列表获取位置/奖励的完整列表
collection.aggregate([
{ $unwind: '$rewards' },
{ $unwind: '$locations' },
{ $project: { name: 1, rewards: 1, locations: 1 } }
}
])
查询结果
下面的内容基本上将所有地点加入到所有奖励中。但是这个奖励只适用于location.id=3,而不适用于3和4,所以我需要从结果中删除location.id=4。我需要继续使用聚合,因为实际查询(此处未显示)包含$geoNear
{
"result" : [
{
"_id" : ObjectId("53728b24e4749ce8ac3f31e7"),
"name" : "Business name",
"locations" : {
"name" : "Downtown Norfolk",
"id" : 3
},
"rewards" : {
"name" : "Newport News Only Reward",
"locationIDs" : [3]
}
},
{
"_id" : ObjectId("53728b24e4749ce8ac3f31e7"),
"name" : "Business name",
"locations" : {
"name" : "McDonald's Suffolk",
"id" : 4
},
"rewards" : {
"locationIDs" : [3]
}
}
],
"ok" : 1
}
我想要的查询结果
我试图从上述查询结果中删除最后一个文档,其中locationId不匹配(locations.id=4不在rewards.locationId=[3])。下面是我想从Mongo得到的信息
{
"result" : [
{
"_id" : ObjectId("53728b24e4749ce8ac3f31e7"),
"name" : "Business name",
"locations" : {
"name" : "Downtown Norfolk",
"id" : 3
},
"rewards" : {
"name" : "Newport News Only Reward",
"locationIDs" : [
3
]
}
}
],
"ok" : 1
}
非常感谢。不确定$redact是否有帮助。我建议使用$cmp运算符来比较值,如下所示:
db.ttt.aggregate({$unwind:"$locations"},
{$unwind:"$rewards"},
{$unwind:"$rewards.locationIDs"},
{$project:
{_id:1,
name:1,
locations:1,
rewards:1,
equality:{
$cmp:['$locations.id','$rewards.locationIDs']
}
}
},
{$match:{equality:0}})
它将排除不匹配的文档,然后您需要重新分组Bingo。我没有考虑过取消“奖励。位置ID”。聪明!这就成功了。