我有这样的文档结构:
{
"_id" : ObjectId("5087b582da50fc570073e094"),
"grade" : "A",
"distance" : "470",
"items" : [
{
"history" : [
...
],
"same" : [
{
"split" : " 1.48",
"time" : " 28.56",
},
{
"split" : " 4.48",
"time" : " 28.56",
},
...
],
"name" : "Bill"
},
{
"history" : [
...
],
"same" : [
{
"split" : " 2.48",
"time" : " 28.26",
},
{
"split" : " 4.49",
"time" : " 28.57",
},
...
],
"name" : "Joe"
},
{
...
}
]
}
我想删除分割值为< same
数组的任何项目。 4。
这应该删除Bill和Joe的same
数组中的第一个条目。
这只是一个示例文档,有许多是相同的。
在我的脑海里,这就是我需要做的事情:
split
数组的same
值是否为< 4 update
和$pull
?)任何人都可以帮我实现这个目标吗?
答案 0 :(得分:1)
首先,我建议你将分组和时间存储为数字,而不是字符串,因为与它进行比较并不好。
使用当前的数据结构,您必须使用您喜欢的任何语言在程序中编写脚本。假设这是你需要做的一次性事情,你写的很好。我不认为通过文档的原子更新可以做到这一点,所以相反,你将不得不在脚本/程序中进行所有数据争论。
如果这是一项非常常见的任务,而不仅仅是一次性的事情,那么我会 建议您将数据重组为以下内容:
{
"_id" : ObjectId("5087b582da50fc570073e094"),
"grade" : "A",
"distance" : "470",
"history" : [
...
],
"same" : [
{
"split" : " 1.48",
"time" : " 28.56",
},
{
"split" : " 4.48",
"time" : " 28.56",
},
...
],
"name" : "Bill"
},
{
"_id" : ObjectId("5087b582da50fc570073e095"),
"grade" : "A",
"distance" : "470",
"history" : [
...
],
"same" : [
{
"split" : " 2.48",
"time" : " 28.26",
},
{
"split" : " 4.49",
"time" : " 28.57",
},
...
],
"name" : "Joe"
},
这样,你可以在找到每个元素(PHP中的代码)之后通过拉动很容易地删除所有这些时间:
$m = new Mongo();
$c = $m->dbname->collectionname;
foreach ( $c->find() as $r )
{
foreach ( $r['same'] as $times )
{
if ($times['split'] < 4 )
{
$c->update(
array( '_id' => $r['_id'] ),
array( '$pull' => array( 'same' => $times ) ),
)
}
}
}