Mongodb$通过比较子文档中的两个字段进行修订

Mongodb$通过比较子文档中的两个字段进行修订,mongodb,Mongodb,我已经更新到Mongodb 2.6.1,并尝试使用新的聚合函数来解决业务问题,但没有成功。我遇到的所有$redact示例都是针对外部变量或静态值进行评估的 我需要根据同级子文档中的值删除一些结果文档。如果可能的话,我相信$redact是实现这一点的方法,但像所有技术挑战一样,我相信有几种方法可以解决。我想保持文档结构不变。如果需要,我可以在我的应用程序代码中消除额外的结果,但更希望数据正好从数据库中出来 这就是我想做的 收藏 Location.id是应用程序代码中的一个整数集,仅用于创建位置和奖

我已经更新到Mongodb 2.6.1,并尝试使用新的聚合函数来解决业务问题,但没有成功。我遇到的所有$redact示例都是针对外部变量或静态值进行评估的

我需要根据同级子文档中的值删除一些结果文档。如果可能的话,我相信$redact是实现这一点的方法,但像所有技术挑战一样,我相信有几种方法可以解决。我想保持文档结构不变。如果需要,我可以在我的应用程序代码中消除额外的结果,但更希望数据正好从数据库中出来

这就是我想做的

收藏

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”。聪明!这就成功了。