Mongodb按值散列查找

时间:2014-09-10 09:42:21

标签: javascript mongodb mongodb-query

我有这个mongodb文档格式:

    {
      "_id": ObjectId("5406e4c49b324869198b456a"),
      "phones": {
        "12035508684": 1,
        "13399874497": 0,
        "15148399728": 1,
        "18721839971": 1,
        "98311321109": -1,
      }
    }

手机字段 - 电话号码及其使用频率的哈希值。

我需要选择所有文件,其频率至少为零或更低。

试试这个:

    db.my_collection.find({"phones": { $lte: 0} })

但没有运气。

提前感谢您的建议

1 个答案:

答案 0 :(得分:5)

你不能在MongoDB中进行那种查询,不管怎么说都不是这么简单,因为你在这里做的通常是“反模式”,其中部分数据实际上被指定为“键” ”。因此,更好的方法是使用“数据”实际上是键的值,而不是相反的方式:

    {
      "_id": ObjectId("5406e4c49b324869198b456a"),
      "phones": [
        { "number": "12035508684", "value": 1 },
        { "number": "13399874497", "value": 0 },
        { "number": "15148399728", "value": 1 },
        { "number": "18721839971", "value": 1 },
        { "number": "98311321109", "value": -1 },
      }
    }

然后你的查询非常简单:

db.collection.find({ "phones.value": { "$lte": 0 } })

但是,否则MongoDB不能“本地”遍历对象/哈希的“键”,为此,您需要进行JavaScript评估才能执行此操作。这对性能来说不是一个好主意。基本上是简短形式的$where查询:

db.collection.find(function() { 
    var phones = this.phones; 
    return Object.keys(phones).some(function(phone) { 
        return phones[phone] <= 0;
    }) 
})

因此,更好的选择是改变您对此进行建模的方式并利用本机运算符。否则,大多数查询都需要和“显式”路径到对象/哈希内的任何“键”。