arrays - MongoDB - 如何访问数组中的对象

标签 arrays node.js mongodb object

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

[
  {
    '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' })

现在假设我忘记了胡萝卜的样子(笑)。我该怎么办?我尝试了以下操作( native 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'

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

最佳答案

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

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

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

您有一个替代方案:

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

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

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

关于arrays - MongoDB - 如何访问数组中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11713386/

相关文章:

performance - MongoDB动态排名

Javascript Funky 数组灾难

javascript - 函数向数组项添加空间

node.js - node server.js 会工作但 npm start 不会

node.js - 全局安装精确依赖项的好方法

MongoDB理解彩信图表

c++ - 为无异常数组寻找一个好的解决方案

c# - 数组中抽象类的派生类

javascript - Node 骑士评估内部的变量未定义

node.js - 如何使用 mongoose 通过 id 选择 mongo 子文档?