我无法用语言准确地描述我的想法,下面是一个例子:
[
{
'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'
你知道吗?我是新来的面向文档的数据库:/
最佳答案
当您在单个文档中存储一组对象时,您将(默认情况下)取回整个文档。[*]
当文档的某个字段是数组时,如果在数组中找到要匹配的项,则将返回完整数组。
如果你通常只会得到其中的一个子集,那么不要被把所有东西都塞进一个文档的诱惑所吸引。
您可以选择:
你可以储存一系列食物,其中每种食物都有一个字段“类型”,即“水果”、“蔬菜”或“…”。你仍然可以查询所有食物,或者只查询“水果”类型的食物,或者只查询名为“胡萝卜”的食物等等。
数组对于特定对象/文档的属性列表非常有用,如果将文档塞进数组中,然后希望将其作为一级对象返回,那么数组就不如前者了。
[*]有一种方法可以投影并只获取字段的一个子集,但仍然可以返回整个字段。