MongoDB查询帮助 - 带/扭曲的子对象查询

时间:2011-08-22 12:26:02

标签: mongodb

我正在尝试在mongo中查询一个像这样结构化的集合......

{
  "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正在检索数据,而这些索引号代表“放置”(第一名,第二名......)

2 个答案:

答案 0 :(得分: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"})

答案 1 :(得分:-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}})