我是mongodb的新手,我想删除数组中的某些元素。
我的文件如下
{
"_id" : ObjectId("4d525ab2924f0000000022ad"),
"name" : "hello",
"time" : [
{
"stamp" : "2010-07-01T12:01:03.75+02:00",
"reason" : "new"
},
{
"stamp" : "2010-07-02T16:03:48.187+03:00",
"reason" : "update"
},
{
"stamp" : "2010-07-02T16:03:48.187+04:00",
"reason" : "update"
},
{
"stamp" : "2010-07-02T16:03:48.187+05:00",
"reason" : "update"
},
{
"stamp" : "2010-07-02T16:03:48.187+06:00",
"reason" : "update"
}
]
}
在文档中,我想删除第一个元素(原因:新)和最后一个元素(06:00)。
我希望使用mongoquery,我没有使用任何java / php驱动程序。
答案 0 :(得分:6)
如果我正确理解你,你想要删除数组的第一个和最后一个元素,如果数组的大小大于3.你可以使用findAndModify查询来完成。在mongo shell中,您将使用以下命令:
db.collection.findAndModify({
query: { $where: "this.time.length > 3" },
update: { $pop: {time: 1}, $pop: {time: -1} },
new: true
});
这将在您的集合中找到与$ where子句匹配的文档。 $ where字段允许您指定任何有效的JavaScript方法。请注意,它仅将更新应用于第一个匹配的文档。
您可能还想查看以下文档:
答案 1 :(得分:4)
您可以使用{ $pop: { time: 1 } }
更新最后一个,然后{ $pop: { time : -1 } }
删除第一个。可能有更好的方法来处理它。
答案 2 :(得分:0)
@javaamtho你不能测试大于3的大小,但只有当它大小为3时,对于大于x的大小,你应该使用$inc
运算符并且你有一个1或-1的字段in删除或添加项目时要保持跟踪(使用数组外部的单独字段,如下所示,time_count)
{
"_id" : ObjectId("4d525ab2924f0000000022ad"),
"name" : "hello",
"time_count" : 5,
"time" : [
{
"stamp" : "2010-07-01T12:01:03.75+02:00",
"reason" : "new"
},
{
"stamp" : "2010-07-02T16:03:48.187+03:00",
"reason" : "update"
},
{
"stamp" : "2010-07-02T16:03:48.187+04:00",
"reason" : "update"
},
{
"stamp" : "2010-07-02T16:03:48.187+05:00",
"reason" : "update"
},
{
"stamp" : "2010-07-02T16:03:48.187+06:00",
"reason" : "update"
}
]
}
答案 3 :(得分:0)
如果您想留下这些时间元素,您可以使用mongo 2.2+中的聚合命令来检索最小和最大时间元素,取消设置所有时间元素,并推送最小和最大版本(通过一些修改它可以完成您的工作):
smax=db.collection.aggregate([{$unwind: "$time"},
{$project: {tstamp:"$time.stamp",treason:"$time.reason"}},
{$group: {_id:"$_id",max:{$max: "$tstamp"}}},
{$sort: {max:1}}])
smin=db.collection.aggregate([{$unwind: "$time"},
{$project: {tstamp:"$time.stamp",treason:"$time.reason"}},
{$group: {_id:"$_id",min:{$min: "$tstamp"}}},
{$sort: {min:1}}])
db.students.update({},{$unset: {"scores": 1}},false,true)
smax.result.forEach(function(o)
{db.collection.update({_id:o._id},{$push:
{"time": {stamp: o.max ,reason: "new"}}},false,true)})
smin.result.forEach(function(o)
{db.collection.update({_id:o._id},{$push:
{"time": {stamp: o.min ,reason: "update"}}},false,true)})
答案 4 :(得分:0)
db.collection.findAndModify({ 查询:{$ where:“this.time.length> 3”}, 更新:{$ pop:{time:1},$ pop {time:-1}}, new:true});
转换为PHP