2011-08-22 74 views
0

我想查询一个集合中的多数民众赞成结构像这样蒙戈...MonogDB查询帮助 - 子对象的查询瓦特/扭曲

{ 
    "type":"apple" 
    "quality": { 
    "1": { 
     "owner":"Dan", 
     "age":28  
    }, 
    "2": { 
     "owner":"Joe", 
     "age":21  
    } 
    "3": { 
     "owner":"Bob", 
     "age":29  
    } 
    } 
} 

我最初尝试findOne({"quality.owner":"Dan"})但失败了。然后我意识到它需要完成像findOne({"quality.1.owner":"Dan"}) ...不是我想要的。

无论如何要放一个通配符代替1或按照我的意图执行查询吗?我不知道所有的变量将是什么质量的对象,所以我不认为我可以做一个“子对象”的比赛要么=/

编辑:

不幸的是重新格式化该数据由于第三方API正在检索数据,并且这些索引编号表示“放置”(第一名,第二位......),因此该项目不存在问题

+0

能否“推”等级/位置下入的对象?或者按排名顺序维护数组的排序顺序?如果API给出的排名没有差距,那应该是可行的... – dcrosta

回答

3

随着你不能像你想要的那样查询当前模式(findOne({"quality.owner":"Dan"}))。使用嵌入式文档,只能使用dot notation进行搜索。

但是你可以重新设计你当前的模式是这样的:

{ 
    "type":"apple" 
    "quality": [ 
    { 
     number: 1, 
     "owner":"Dan", 
     "age":28  
    }, 
    { 
     number: 2, 
     "owner":"Joe", 
     "age":21  
    }] 
    } 
} 

,然后搜索使用点符号:

findOne({"quality.owner":"Dan"}) 
+0

'$'位置运算符仅用于更新。通过搜索数组来查找,只需省略与数组索引相对应的路径段即可:findOne({“quality.owner”:“Dan”})' – dcrosta

+0

好吧,“你不能”是我需要的听到=) - 让问题保持一段时间。 –

+0

@dcrosta:是的,这是我的错误,现在修好了。谢谢。 –

-1

如果您可以重新配置文档以使用数组而不是子文档代替quality字段,那么你可以像你想要的那样查询。此外,您可以efficiently index array member fields or the whole array(即子文档本身):

db.collection.ensureIndex({"quality.owner": 1}) 
db.collection.findOne({"quality.owner": "Dan"}) 

如果转换到使用数组,然后你可以使用the $ positional operator执行对数组元素的更新和他们的成员:

db.collection.update({"quality.owner": "Dan"}, {$set: {"quality.$.age": 27}}) 
+0

定位运算符只适用于数组 –

+0

对不起,这就是我的意思 - 就像“你甚至可以使用'$'一次你转换为数组。“将更新以澄清。 – dcrosta