无法在子文档中获取一些信息

时间:2014-01-27 19:33:37

标签: mongodb mongoose

我想在我的mongoDB集合中获取一个值。我想得到一部电影的标题和当前这部电影的销量(nbSold)。

以下是我的数据存储方式:

"_id" : ObjectId("52e6a1aacf0b3b522a8a157a"),
"title" : "Pulp Fiction",
"sales" : [
        {
            "date" : ISODate("2013-11-01T00:00:00Z"),
            "nbSold" : 6
        },
        {
            "date" : ISODate("2013-12-01T00:00:00Z"),
            "nbSold" : 2
        }
    ]

我正在使用mongoose,这就是我在2013年12月构建查询的方式:

var query = Movie.find({"title":"Pulp Fiction"}, "title sales.nbSold")
                 .where("sales.date")
                 .equals(new Date("2013-12-01"));

但是,这是我收到的输出:

{ title: 'Pulp Fiction', sales: [ { nbSold: 6 }, { nbSold: 2 } ] }

我想只有与当月的nbSold相关联的标题(在我的情况下为2)。这样做的正确方法是什么?

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

首先,您应该关闭where电话。完成比较后,您应该致电.exec(callback),并且应该使用select代替等号和$elemMatch。试试这个:

var query = Movie.find({"title":"Pulp Fiction"}, "title sales.nbSold")
                 .where("sales.date")
                 .select({ sales: { $elemMatch: new Date("2013-12-01") }})
                 .exec(function(err, doc) {
                     return console.dir(doc);
                 });

你也应该有一个回调。 我在我的机器上运行它,它确实有用。我之前发布的代码并不完全正确,但这样就可以了。 See the documentation for an example.

另外,我会关注你如何看到日期是否匹配。如果Date对象中的时间已关闭但日期匹配,则Mongo将找不到匹配项。我并不确切知道它在Mongo中是如何工作的,但是在JavaScript中,你不能直接比较两个Date个对象是否相等,因为它们都是具有相同值的不同对象,所以你可能会遇到这个问题同样。 See this post for an example on how to do it.