Mongo使用未知父键查找值

时间:2014-11-19 20:49:06

标签: mongodb mongodb-query

我在Mongo表中寻找一个值,其父键可能没有描述性或已知名称。以下是我们的文档之一的示例。

    { 
       "assetsId": {
         "0": "546cf2f8585ffa451bb68369" 
      },
       "slotTypes": {
         "0": { "usage": "json" },
         "1":  { "usage": "image" }
      }
    }

我希望看看这是否含有"用法":" json"在slotTypes中,但我不能保证此用法的父键将是" 0"。

我尝试使用以下查询而没有任何运气:

db.documents.find(
   {
     slotTypes:
       {
          $elemMatch:
            {
               "usage": "json"
            }
       }
    }
)

如果这是一个非常基本的问题,请提前抱歉,但我不习惯在nosql数据库中工作。

1 个答案:

答案 0 :(得分:5)

我不确定您是否能够使用当前架构优雅地解决这个问题; slotTypes应该是一个子文档数组,这将允许您的$elemMatch查询工作。现在,它是一个带有数字键的对象。

也就是说,您的文档架构应该类似于:

{
   "assetsId": {
     "0": "546cf2f8585ffa451bb68369"
  },
   "slotTypes": [
     { "usage": "json" },
     { "usage": "image" }
  ]
}

如果更改数据布局不是一个选项,那么您将需要基本扫描每个文档以查找与$where的匹配项。这是缓慢的,无法索引的,也很尴尬。

db.objects.find({$where: function() {
  for(var key in this.slotTypes) {
    if (this.slotTypes[key].usage == "json") return true;
  }
  return false;
}})

你应该阅读documentation on $where以确保你理解它的警告,并且为了所有圣洁的爱,消毒你对功能的投入;这是在数据库上下文中执行的实时代码。