繁体   English   中英

Mongodb按值在哈希中查找

[英]Mongodb find in hash by value

我有此mongodb文件格式:

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

手机字段-它是电话号码和使用频率的哈希值。

而且我需要选择所有具有至少一个零或更少频率的文档。

试试这个:

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

但没有运气。

预先感谢您的建议

您无法在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;
    }) 
})

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM