MongoDB - 具有嵌套字段的操作

时间:2016-10-23 08:38:37

标签: mongodb mongodb-query aggregation-framework

我的Twitter数据看起来像这样:

    $(document).ready(function () {
        var image = $('#man');

        var legTooltip = 'LEG';

        image.mapster({
            fillOpacity: 0.5,
            mapKey: 'alt',
            fillColor: "000000",
            listKey: 'alt',
            scaleMap: falsee,
            singleSelect: true,
            toolTipClose: ["tooltip-click", "area-click", "area-mouseout"],
            showToolTip: true,
            onClick: function (e) {
                if (e.key === 'leg') {
                   var **symp** = e.key;                        
                }                    
            },
            areas: [
            {
                key: "leg",
                toolTip: legTooltip
            }],
            render_highlight: {
                fade: false
            }                
        });
    });

例如,我想找到拥有" FollowersCount"的用户数量。大于" FavouritesCount"。我怎么能这样做?

2 个答案:

答案 0 :(得分:3)

$where运算符是专门为此设计的。

db.users.find( { $where: function() { return (this.user.FollowersCount > this.user.FavouritesCount) } } );

但请记住,这会运行单线程JS代码,而且速度会慢一些。

另一个选择是使用聚合管道来预测差异,然后在差异上有$match

db.users.aggregate([
  {$project: {
    diff: {$subtract: ["$user.FollowersCount", "$user.FavouritesCount"]},
    // project remaining fields here
    }
  },
  {$match: {diff: {$gt: 0}}}
])

根据我的经验,我发现第二个比第一个快得多。

答案 1 :(得分:0)

要获得“FollowersCount”大于“FavouritesCount”的用户数,您可以使用聚合框架,该框架包含一些您可以应用的运算符。

考虑第一个用例,该用例着眼于操纵 $project 管道中的比较运算符以及后续的 $match 管道来过滤基于文档的在 $cmp 值上。然后,您可以通过应用聚合过滤文档的 $group 管道来获取最终用户数:

db.users.aggregate([
    {
        "$project": {               
            "hasMoreFollowersThanFavs": { 
                "$cmp": [ "$user.FollowersCount", "$user.FavouritesCount" ]
            }
        }
    },
    { "$match": { "hasMoreFollowersThanFavs": 1 } },    
    {
        "$group": {
            "_id": null,
            "count": { "$sum": 1 }
        }
    }
])

另一种选择是使用带有 $redact 运算符的单一管道,其中包含 $project $match的功能如上所述,使用 $$KEEP 系统变量返回符合指定条件的所有文档,并使用 $$PRUNE 系统变量:

db.collection.aggregate([
    {
        "$redact": {
            "$cond": [
                { 
                    "$eq": [
                        { "$cmp": [ "$user.FollowersCount", "$user.FavouritesCount" ] }, 
                        1
                    ]
                }, 
                "$$KEEP", 
                "$$PRUNE"
            ]
        }
    },  
    {
        "$group": {
            "_id": null,
            "count": { "$sum": 1 }
        }
    }
])