【问题标题】:Various queries - MongoDB各种查询 - MongoDB
【发布时间】:2011-03-20 19:50:57
【问题描述】:

这是我的桌子

unicorns =  {'name':'George',
             'actions':[{'action':'jump', 'time':123123}, 
                        {'action':'run', 'time':345345}, 
                        ...]}

如何执行以下查询?

  • 获取所有独角兽的所有动作其中action=='jump'的时间?

  • 获取所有独角兽的所有动作,其中时间相等

    例如{'action':'jump', 'time':123} 和 {'action':'stomp', 'time':123}


帮助将是惊人的 =)

【问题讨论】:

    标签: python django mongodb pymongo nosql


    【解决方案1】:

    对于第二个查询,你需要使用 MapReduce,它可以得到一个大毛。这将起作用:

    map = function() {
        for (var i = 0, j = this.actions.length; i < j; i++) {
            emit(this.actions[i].time, this.actions[i].action);
        }
    }
    reduce = function(key, value_array) {
        var array = [];
        for (var i = 0, j = value_array.length; i < j; i++) {
            if (value_array[i]['actions']) {
                array = array.concat(value_array[i]['actions']);
            } else {
                array.push(value_array[i]);
            }
        }
        return ({ actions: array });
    }
    
    res = db.test.mapReduce(map, reduce)
    db[res.result].find()
    

    这将返回类似这样的内容,其中 _id 键是您的时间戳:

    { "_id" : 123, "value" : { "actions" : [ "jump" ] } }
    { "_id" : 125, "value" : { "actions" : [ "neigh", "canter" ] } }
    { "_id" : 127, "value" : { "actions" : [ "whinny" ] } }
    

    不幸的是,mongo 目前不支持从 reduce 函数返回数组,因此需要愚蠢的 {actions: [...]} 语法。

    【讨论】:

    • 哇,谢谢艾米丽!感谢您将我指向这个方向,并感谢 MapReduce 功能!我现在就在上面!! =)
    【解决方案2】:

    使用点分隔符号:

    db.unicorns.find({'actions.action' : 'jump'})
    

    同样的时间:

    db.unicorns.find({'actions.time' : 123})
    

    编辑:如果要按时间对结果进行分组,则必须使用MapReduce

    【讨论】:

    • 第二次查询似乎选择了action.time==123 的所有独角兽。我在这里可能错了,但我知道问题是关于{12345: [{'action': 'jump', 'time': 12345}, {'action': 'stomp', 'time': 12345}], 12390: [{'action': 'jump', 'time': 12390}, {'action': 'run', 'time': 12390}]} 之类的结果...但也许我错了:)
    • 感谢您的回复!! =) 对于第二个查询,我要求更多按时间分组操作,应该更好地表达自己。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    相关资源
    最近更新 更多