【问题标题】:MongoDB - How to access an object in an arrayMongoDB - 如何访问数组中的对象
【发布时间】:2012-07-27 15:24:36
【问题描述】:

我无法用语言准确地描述我的想法,所以这里有一个例子:

[
  {
    'description': 'fruits',
    'examples': [
      {
        'name': 'Apple',
        'color': ['red', 'green']
      },
      {
        'name': 'Banana',
        'color': 'yellow'
      }
    ]
  },
  {
    'description': 'vegetables',
    'examples': [
      {
        'name': 'Tomato',
        'color': 'red'
      },
      {
        'name': 'Carrot',
        'color': 'orange'
      }
    ]
  },
  {
    'description': 'Wweets',
    'examples': [
      {
        'name': 'Chocolate',
        'color': ['brown', 'black', 'white']
      },
      {
        'name': 'Candy',
        'color': 'various'
      }
    ]
  }
]

让我们一步一步来:

如果我想查看所有食物类别,我通过以下命令查询

db.food.find()

我想看看蔬菜

db.food.find({ 'description': 'vegetables' })

现在假设我忘记了胡萝卜的样子(笑)。我该怎么办?我尝试了以下(本机 node.js MongoDB 驱动程序):

collection.find({'examples.name': 'Carrot'}, function(err, example){
  console.log(example)
  // It still returns me the whole object!
});

因此,我希望 MongoDB 返回对象的下一个最高实例。例如,我想这样做。

console.log(example.color)
// 'orange'

你有什么想法吗?我是面向文档的数据库的新手:/

【问题讨论】:

  • 嘿,通过查找,您可以获得整个文档,但您无法获得一部分。所以,你得到了文档,然后你通过一个小函数来寻找索引;)
  • 嘿,这个小功能怎么样? :) 我可以在我的节点应用程序中实现它吗?我对这一切都很陌生。
  • 看看 aydio 的答案 ;) 因此,您创建了一个库,用于使用此函数进行基本操作。你需要。 ;) 编辑:哦,是你哈哈

标签: arrays node.js mongodb object


【解决方案1】:

当您将一堆对象存储在单个文档中时,您将(默认情况下)取回整个文档。 [*]

当文档的其中一个字段是数组时,如果在数组中找到您尝试匹配的项目,您将返回完整的数组。

如果您通常只取回其中的一部分,请不要将所有内容都塞进一个文档中。

您有替代方案:

您可以存储一组食物,其中每种食物都有一个字段“类型”,即“水果”或“蔬菜”或“...”。您仍然可以查询所有食物,或仅查询“水果”类型的食物或仅查询名称为“胡萝卜”的食物等。

数组非常适合用于特定对象/文档的属性列表,但当您将文档塞入其中然后您希望将其作为一等对象返回时,它们就不那么好了。

[*] 有一种方法可以投影并仅获取字段的子集,但您仍将取回整个字段。

【讨论】:

  • 感谢您的澄清。昨天我认为我度过了非常有成效的一天,因为我几乎完成了整个平台的编程,但现在我被困住了,我可能不得不重新考虑我的文档结构...... :(也许我最终会做对象引用,但那会错过了mongodb的重点......我会寻找其他解决方案。
  • a) 我不明白你为什么需要对象引用 b) 我不明白为什么这会忽略 mongoDB...
  • 对象引用,因为我当前的模型嵌套非常深,会导致这样的问题。据我所知,MongoDB 遵循将数据存储在相应对象中的理念(直接在帖子中保存 cmets 等)但正如我所说,我对面向文档的数据库完全陌生,所以不要太认真- 我只是想学习...
  • 将 cmets 存储在与帖子不同的集合中是非常好的 - 事实上,您希望将可以保持增长的东西分开存储。查看 10gen.com 网站上的一些架构设计演示,了解一些讨论/示例。
  • 现在我将 cmets 存储在实体中(在我的情况下,它是一家被评级的公司)。但是,感谢您将我指向 10gen 演示文稿,我会看一下。我还从 O'Reilly 购买了 MongoDB 书,并且可能会在我的应用上线之前完成这本书。
猜你喜欢
  • 2022-01-21
  • 2017-06-20
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
相关资源
最近更新 更多