在这种情况下如何查询 mongodb
how to query mongodb in this case
我在 collection 中有以下内容:
{
"Tom": {
"age": 20,
"address": "xxx"
},
"John": {
"age": 23,
"address": "xxx"
},
...
}
如何在mongodb shell或其他软件中编写查找年龄大于N的地址的命令?
我建议您更改架构并将文档存储在以下结构中:
db.t.insert([{
"name":"Tom",
"age":20,
"address":"address1"
},
{
"name":"John",
"age":23,
"address":"address2"
}])
这使得查询变得非常简单直接:
db.t.find({"age":{$gt:20}})
当您的文档中的键是高度可变的数据 (names
) 时,动态查询几乎不可能。不过,您将能够使用 aggregation framework
查询它,但这是有代价的。只是为了记录,我会 post 聚合查询到您当前的文档结构。
var age = 20;
db.t.aggregate([
{$redact:{$cond:[{$gt:[{$ifNull:["$age",age+1]},age]},
"$$DESCEND","$$PRUNE"]}}
])
查询使用 $redact stage alone and traverses and keeps all the sub documents within a document which meet the criteria in the $cond 表达式。其余的它丢弃。
我在 collection 中有以下内容:
{
"Tom": {
"age": 20,
"address": "xxx"
},
"John": {
"age": 23,
"address": "xxx"
},
...
}
如何在mongodb shell或其他软件中编写查找年龄大于N的地址的命令?
我建议您更改架构并将文档存储在以下结构中:
db.t.insert([{
"name":"Tom",
"age":20,
"address":"address1"
},
{
"name":"John",
"age":23,
"address":"address2"
}])
这使得查询变得非常简单直接:
db.t.find({"age":{$gt:20}})
当您的文档中的键是高度可变的数据 (names
) 时,动态查询几乎不可能。不过,您将能够使用 aggregation framework
查询它,但这是有代价的。只是为了记录,我会 post 聚合查询到您当前的文档结构。
var age = 20;
db.t.aggregate([
{$redact:{$cond:[{$gt:[{$ifNull:["$age",age+1]},age]},
"$$DESCEND","$$PRUNE"]}}
])
查询使用 $redact stage alone and traverses and keeps all the sub documents within a document which meet the criteria in the $cond 表达式。其余的它丢弃。