Jor*_*ork 6 php mongodb mongodb-php
我需要存储一些基本上只是日期/整数的键值对数组的数据,其中日期将始终是唯一的.
我希望能够像关联数组一样存储它:
array(
"2012-02-26" => 5,
"2012-02-27" => 2,
"2012-02-28" => 17,
"2012-02-29" => 4
)
Run Code Online (Sandbox Code Playgroud)
但我还需要能够查询日期(即获取日期> 2012-02-27的所有内容),因此怀疑我需要使用更像的模式:
array(
array("date"=>"2012-02-26", "value"=>5),
array("date"=>"2012-02-27", "value"=>2),
array("date"=>"2012-02-28", "value"=>17),
array("date"=>"2012-02-29", "value"=>4),
)
Run Code Online (Sandbox Code Playgroud)
显然前者更清晰,更简洁,但我能否以我想要的方式查询它,如果没有,是否还有其他可能更合适的模式?
Gat*_* VP 10
你已经描述了两种方法,让我分解它们.
方法#1 - 关联数组
通过"关联数组"查询的关键工具是$exists运算符.以下是运营商的详细信息.
所以你绝对可以运行如下查询:
db.coll.find( { $exists: { 'field.2012-02-27' } } );
Run Code Online (Sandbox Code Playgroud)
根据您的描述,您正在寻找与$exists运营商不匹配的范围查询."关联数组"版本也很难索引.
方法#2 - 对象数组
这肯定有更好的查询功能:
db.coll.find( { 'field.date': { $gt: '2012-02-27' } } );
Run Code Online (Sandbox Code Playgroud)
它也可以编入索引
db.coll.ensureIndex( { 'field.date': 1 } );
Run Code Online (Sandbox Code Playgroud)
但是,需要在更新方面进行权衡.如果要增加特定日期的值,则必须使用此难以处理的$位置运算符.这适用于一组对象,但是对于任何具有进一步嵌套的东西都是失败的.
其他问题
这两种方法中的任何一个问题都是数据的长期增长.在扩展对象大小时,它将占用磁盘和内存中的更多空间.如果您有一个具有两年数据的对象,则需要在内存中存储700个项目的整个数组,以便您今天更新数据.这可能不是您的特定数据的问题,但应该考虑它.
同样,MongoDB查询总是返回顶级对象.同样,如果您有一个包含700个项目的数组,那么您将获得匹配的每个文档的所有项目.有一些方法可以过滤掉返回的字段,但它们不适用于"对象数组".
| 归档时间: |
|
| 查看次数: |
3512 次 |
| 最近记录: |