Удалить элемент из массива в mongodb - PullRequest
5 голосов
/ 09 февраля 2011

Я новичок в 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 ]

6 голосов
/ 29 августа 2011

Если я правильно вас понимаю, вы хотите удалить первый и последний элементы массива, если размер массива больше 3. Это можно сделать с помощью запроса findAndModify.В оболочке mongo вы будете использовать эту команду:

db.collection.findAndModify({
    query: { $where: "this.time.length > 3" },
    update: { $pop: {time: 1}, $pop: {time: -1} },
    new: true
});

Это найдет документ в вашей коллекции, который соответствует предложению $ 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.
4 голосов
/ 09 февраля 2011

Вы можете обновить его с помощью { $pop: { time: 1 } }, чтобы удалить последний, и { $pop: { time : -1 } }, чтобы удалить первый.Хотя, вероятно, есть лучший способ справиться с этим.

0 голосов
/ 20 октября 2013

db.collection.findAndModify ({ запрос: {$ где: "this.time.length> 3"}, обновление: {$ pop: {time: 1}, $ pop {time: -1}}, new: true});

конвертировать в PHP

0 голосов
/ 20 ноября 2012

Если вы хотите оставить эти временные элементы, вы можете использовать агрегирующую команду из 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)})
0 голосов
/ 10 февраля 2011

@ javaam, вы не можете проверить размер больше 3, но только если он точно равен 3, для размера больше числа x вы должны использовать оператор $inc и иметь поле, в котором вы можете указать 1 или -1, отслеживать при удалении или добавлении элементов (используйте отдельное поле вне массива, как показано ниже, 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"
      }
  ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...