mongodb вытащить элемент из массива - PullRequest
0 голосов
/ 11 февраля 2012

У меня есть следующая схема:

{
  "_id" : 27,
  "n" : [{
      "d" : new Date("Sat, 24 Dec 2011 17:03:00 GMT +04:00"),
      "e" : ObjectId("4f0aef5346b3b88013000001"),
      "f" : [26, 10, 16],
      "k" : new Date("Mon, 09 Jan 2011 17:44:51 GMT +04:00"),
      "t" : "f",
      "u" : 10
    }, {
      "a" : ObjectId("4f0c208846b3b8140f000000"),
      "d" : new Date("Tue, 10 Jan 2012 15:27:21 GMT +04:00"),
      "p" : [ObjectId("4f0c209046b3b8340f000000"), ObjectId("4f0c209346b3b8340f000001"), ObjectId("4f0c209646b3b8340f000002"), ObjectId("4f0c209946b3b8340f000003")],
      "t" : "p",
      "u" : 10
    }]
}

и этот запрос удаляет все подэлементы, если хотя бы один из них удовлетворяет этому

db.newsFeed.update({ "_id" : 27, },{
$pull : {
 'n' : {
    'd' : {
        $lte : new Date(2012, 1, 1)
        }
    }
}
});

так что документ становится таким, { "_id": 27, "n": [] }

что я делаю не так, и что более важно, что я должен сделать, чтобы вытянуть только некоторые элементы?

1 Ответ

2 голосов
/ 11 февраля 2012

Я думаю, что ваш запрос в порядке, проблема в дате, которую вы используете.

Вместо:

new Date(2012, 1, 1)

Попробуйте:

ISODate("2012-01-01")

Попробуйте ввести их в оболочку самостоятельно, и вы получите следующие результаты:

> new Date(2012, 1, 1)
ISODate("2012-02-01T07:00:00Z")

> ISODate("2012-01-01")
ISODate("2012-01-01T00:00:00Z")

По крайней мере, это то, что я вижу в своей раковине. Использование «new» возвращает дату, которая соответствует обоим элементам вашего массива, поэтому они оба удаляются. Использование ISODate напрямую создает искомый объект даты и соответствует только первому результату.

Конструктор Date занимает месяц, начинающийся с нуля, поэтому вы можете использовать его, если хотите использовать new:

new Date(2012, 0, 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...