【问题标题】:Mongo find value with unknown parent keyMongo用未知的父键查找值
【发布时间】:2015-01-17 13:14:05
【问题描述】:

我正在 Mongo 表中查找其父键可能没有描述性或已知名称的值。这是我们的一份文件的外观示例。

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

我正在查看这是否在 slotTypes 中包含“usage”:“json”,但我不能保证此用法的父键将为“0”。

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

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

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

【问题讨论】:

  • 没有。这不可能。如果slotTypes 是一个数组,这将是可能的。
  • 你可以使用全文搜索
  • 我真的很想远离全文搜索。这样做似乎有点 hacky。

标签: mongodb mongodb-query


【解决方案1】:

我不确定您是否能够使用当前架构优雅地解决此问题; 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 以确保您了解其中的注意事项,并且出于对所有神圣事物的热爱,请清理您对该函数的输入;这是在您的数据库上下文中执行的实时代码。

【讨论】:

  • 谢谢克里斯,我同意你的观点,这些 slotTypes 应该被放入一个数组中,但这是我要与我拥有的军队开战的情况之一,而不是我想要的.当我运行你给我的脚本时,我没有得到任何结果。
  • 确保在正确的集合上运行它。我在本地针对您的测试文档运行它,发现它很好。
  • 对不起,我拼错了表名,但确实有效。
  • @ChrisHeald - 当父键未知时如何处理?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
  • 2015-08-17
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多