我有这个mongodb文档格式:
{
"_id": ObjectId("5406e4c49b324869198b456a"),
"phones": {
"12035508684": 1,
"13399874497": 0,
"15148399728": 1,
"18721839971": 1,
"98311321109": -1,
}
}
手机字段 - 电话号码及其使用频率的哈希值。
我需要选择所有文件,其频率至少为零或更低。
试试这个:
db.my_collection.find({"phones": { $lte: 0} })
但没有运气。
提前感谢您的建议
答案 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;
})
})
因此,更好的选择是改变您对此进行建模的方式并利用本机运算符。否则,大多数查询都需要和“显式”路径到对象/哈希内的任何“键”。