2012-10-21 48 views
1

我需要存储的餐厅与它们对应的菜单项,所以我做了这样的事情MongoDB的集合格式

{ name: 'Foo', 
    menu: 
[ { item: 'foo', 
    description: '...', 
    price: 20 }, 
{ item: 'bar', 
    description: '...', 
    price: 30 } ] 
} 

问题是,我有时需要访问此项目,但它并不容易这样做,我应该而是使用这样的东西?

{ name: 'Foo', 
menu: 
{ "0": { item: 'foo', 
    description: '...', 
    price: 20 }, 
"1": { item: 'bar', 
    description: '...', 
    price: 30 } } 
} 

我认为找到一个特定的物品会更便宜。

回答

1

使用可通过编号键访问的嵌入对象很少是正确的方法。 MongoDB拥有运算符来帮助访问数组中提供更好的灵活性的项目。

请参阅$elemMatch$投影算子,了解如何只提取所需的数组元素。

举例来说,从你的第一个例子中的文档得到'foo'菜单项:

db.restaurants.findOne({name: 'Foo'}, {menu: {$elemMatch: {item: 'foo'}}}); 
+0

不知道为什么即时得到“未捕获的异常:错误{‘$ ERR’:‘不支持的投影选项:$ elemMatch’,”代码“:13097}” – jtomasrl

+2

@jtomasrl你运行的是哪个版本的MongoDB?在2.2中增加了$ elemMatch。 – JohnnyHK

+0

工作完美,谢谢 – jtomasrl