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

时间:2012-07-29 22:07:09

标签: 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'
你知道吗?我是面向文档的DB的新手:/

1 个答案:

答案 0 :(得分:2)

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

当文档的某个字段是数组时,如果在阵列中找到了您要匹配的项目,则将返回完整数组。

如果你通常只回到这些事情的一部分,那么不要试图把所有东西塞进一个文件中。

您有另一种选择:

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

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

[*]有一种方法可以投射并只获得一部分字段,但您仍然可以返回整个字段。