从mongodb中的数组中删除元素

时间:2011-02-09 13:58:06

标签: mongodb

我是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驱动程序。

5 个答案:

答案 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. http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-JavascriptExpressionsand%7B%7B%24where%7D%7D了解有关$ where子句的更多信息。
  2. http://www.mongodb.org/display/DOCS/Updating#Updating-%24pop 更多关于$ pop。
  3. http://www.mongodb.org/display/DOCS/findAndModify+Command了解更多信息 在findAndModify。

答案 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