我正在mongo表中查找一个值,该表的父键可能没有描述性名称或已知名称。下面是我们的一个文档的外观示例。

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

我想看看在slottypes中是否包含“usage”:“json”,但我不能保证这个用法的父键是“0”。
我尝试使用以下查询,但没有成功:
db.documents.find(
   {
     slotTypes:
       {
          $elemMatch:
            {
               "usage": "json"
            }
       }
    }
)

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

最佳答案

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

{
   "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以确保理解其中的注意事项,并且出于对所有神圣事物的热爱,清除对函数的输入;这是在数据库上下文中执行的实时代码。

关于mongodb - Mongo使用未知父键查找值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27026674/

10-16 18:29