2012-02-10 7 views
0

У меня есть следующая схема:MongoDB вытащить элемент из массива

{ 
    "_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, "п": []}

, что я делаю не так, и что более важно то, что шо uld Я делаю, чтобы вытащить только некоторые из элементов?

ответ

2

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

Вместо:

new Date(2012, 1, 1) 

Try:

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") 

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

конструктора Date занимает месяц на основе нулевой, так что вы хотите, если вы хотите использовать новые:

new Date(2012, 0, 1) 
Смежные вопросы