0

现在,我们正在使用 mongodb 1.2.2 创建数据库并存储值。我们的数据类型如下所示:

"file" : "1" , "tools": { "foo": { "status": "pending"} }
"file" : "2" , "tools": { "bar": { "status": "pending" } }
"file" : "3" , "tools": { "foo": { "status": "running" } }
"file" : "4" , "tools": { "bar": { "status": "done" } }
"file" : "5" , "tools": { "foo": { "status": "done" } } 

我们想查询每一个我们{ "status" : "pending" }.不想使用的变量,{"tools.foo.status" : "pending"}因为除了 foo 和 bar 之外,我们还有许多不同的变体。为了更清楚,我们想做这样的事情{"tools.*.status" : "pending"}

4

3 回答 3

1

不,你不能那样做。恐怕您必须为此维护自己的索引。也就是说,对于文件集合的每次插入/更新,对 file_status_index 集合执行更新插入以更新当前状态。

查询也是一个两步过程:首先查询索引集合以获取 id,然后$in向文件集合发出查询以获取实际数据。

这听起来可能很吓人,但这是您使用此架构必须付出的代价。

于 2012-07-09T20:58:21.983 回答
1

首先,您应该升级您的 MongoDB。1.2.2真的是老版本了。

其次,你不能做你问的查询。您可以使用Map/Reduce 执行此操作。

于 2012-07-10T06:14:22.703 回答
0

我想是时候问问你为什么要以现在的方式存储东西了。

没有有效的方法来搜索这种结构;由于没有已知的仅键路径可以获取您要过滤的值,因此每条记录都需要每次都扩展,这非常昂贵,尤其是当您的集合不再适合 RAM 时。

IMO,您最好使用辅助集合来保持这些状态。是的,它使您的数据存储更具关联性,但那是因为您的数据关联的。

file_tools:
  { 'file_id' : 1, 'name' : 'foo', 'status' : 'pending' }
  { 'file_id' : 2, 'name' : 'bar', 'status' : 'pending' }
  { 'file_id' : 3, 'name' : 'foo', 'status' : 'running' }
  { 'file_id' : 4, 'name' : 'foo', 'status' : 'done' }
  { 'file_id' : 5, 'name' : 'foo', 'status' : 'done' }


files:
  { 'id': 1 }
  { 'id': 2 }
  { 'id': 3 }
  { 'id': 4 }
  { 'id': 5 }

> // find out which files have pending tools
> files_with_pending_tools = file_tools.find( { 'status' : 'pending' }, { 'file_id' : 1 } )
> //=> [ { 'file_id' : 1 }, { 'file_id' : 2 } ]
> 
> // just get the ids
> file_ids_with_pending_tools = files_with_pending_tools.map( function( file_tool ){
>    file_tool['file_id']
> })
> //=> [1,2]
> 
> // query the files
> files.find({'id': { $in : file_ids_with_pending_tools }})
> //=> [ { 'id' : 1 }, { 'id' : 2 } ]
于 2012-07-09T20:58:56.710 回答