mongodb从数组中拉出元素

时间:2012-02-10 23:24:30

标签: 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,   “n”:[] }

我做错了什么,更重要的是我应该做些什么才能拉出一些元素?

1 个答案:

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