我有以下架构:
{
"_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”:[] }
我做错了什么,更重要的是我应该做些什么才能拉出一些元素?
答案 0 :(得分:2)
我认为你的查询很好,问题是你正在使用的日期。
而不是:
new Date(2012, 1, 1)
尝试:
ISODate("2012-01-01")
尝试自己在shell中输入它们,然后你会收到这些结果:
> new Date(2012, 1, 1)
ISODate("2012-02-01T07:00:00Z")
> ISODate("2012-01-01")
ISODate("2012-01-01T00:00:00Z")
至少,这就是我在shell中看到的。使用“new”返回与数组的两个元素匹配的日期,因此它们都被删除。使用ISODate可以直接创建您正在查找的日期对象,并且仅匹配第一个结果。
Date构造函数采用基于零的月份,因此如果要使用new:
,则需要这样做new Date(2012, 0, 1)