Mongoose查找查询vs $ match

时间:2017-12-05 02:11:28

标签: node.js mongodb

我在mongodb中有一个以下文档

{
    "_id" : ObjectId("5a25f1b19c72e07ffc50a37d"),
    "name" : "test",
    "category" : ObjectId("5a1e6622a7739fb64c8c530b"),
    "recentDeveloperComment" : ObjectId("5a25f1b19c72e07ffc50a37c"),
    "fileName" : "test2.xlsx",
    "rawData" : ObjectId("5a21079ef99e75b2140fb77a"),
    "group" : {
        "year" : 2017,
        "month" : 1,
        "category" : "test1"
    },
    "unlocked" : false,
    "status" : "Pending",
    "updatedAt" : ISODate("2017-12-05T01:08:40.465Z"),
    "createdAt" : ISODate("2017-12-05T01:08:40.465Z"),
    "__v" : 0
}

我可以通过使用以下查找查询与mongoose

来匹配此项
Repo.find({'group.year' : year, 'group.month' : month, 'group.category' : category, name:repo})
    .exec((err, repoResult) => {
        //matches one document
    })

但是如果使用以下聚合$匹配,我无法得到相同的结果

Repo.aggregate([
    {
        $match:
            {
                $and:[
                    {'group.year' : year},
                    {'group.month' : month},
                    {'group.category' : category},
                    {name : repo}
                ]
            }
    },
]).exec((err, commitsResult) => {
    //matches zero document
});

为什么会这样?

1 个答案:

答案 0 :(得分:0)

这是因为year将所有查询字符串解析为数据库中定义的变量类型。例如,Find是从url解析的参数,因此它是字符串形式,但在Mongodb中,字段被定义为int。 $match会自动将其解析为正确的类型,但 function ListNode(val) { this.val = val; this.next = null; } 不解析它,因此必须手动完成。