如何在mongodb中搜索嵌套对象的数据

时间:2015-04-11 11:02:45

标签: mongodb meteor

我下面有一个对象。

{
    "_id" : "8LEfPt57rWHZ8ebdS",
    "createdAt" : ISODate("2015-04-07T16:00:30.798Z"),
    "services" : {
        "password" : {
            "bcrypt" : "$2a$10$SIUgFIWTq6nBmTIqNjMYFOSKtds.yR26fm8yblbcRm3yYeg.rH3jK"
        },
        "resume" : {
            "loginTokens" : [
                {
                    "when" : ISODate("2015-04-07T16:00:30.992Z"),
                    "hashedToken" : "Qnq4m/ETqI/heHPIYGdAJIyYQJNQ0EH5MFgDjgQt2GY="
                },
                {
                    "when" : ISODate("2015-04-09T14:49:08.652Z"),
                    "hashedToken" : "xxm3xXggjT1v8vcaY4/uLXUtPdMKyXaPp7xCLF6gBeM="
                }
            ]
        }
    },
}

我想获取已登录日期范围的用户列表。

但我没有得到以下查询的任何结果。

db.users.find({ 'services.resume.loginTokens': { $elemMatch: { when:  { '$lte': '2015-04-11T18:29:59.999Z', '$gte': '2015-04-04T18:29:59.999Z' } } } })

任何人都可以帮助我。

2 个答案:

答案 0 :(得分:1)

Mongo aggregation pipline和mongo aggregation $and运算符会找到您的确切结果。检查以下查询

db.collectionName.aggregate({
    "$unwind": "$services.resume.loginTokens"
}, {
    "$match": {
    "$and": [{
        "services.resume.loginTokens.when": {
            "$lt": ISODate("2015-04-11T18:29:59.999Z")
        }
    }, {
        "services.resume.loginTokens.when": {
            "$gt": ISODate("2015-04-04T18:29:59.999Z")
        }
    }]
    }
}).pretty()

答案 1 :(得分:0)

它非常简单..你必须把ISODate格式的日期放入查询中,因为你在DB中有ISO格式的日期并且它不是字符串,你可以为字符串写这种类型的查询,所以

替换您的查询

db.users.find({ 'services.resume.loginTokens': { $elemMatch: { when: { '$lte': '2015-04-11T18:29:59.999Z', '$gte': '2015-04-04T18:29:59.999Z' } } } })

到这个

db.dummy.find({ 'services.resume.loginTokens': 
{ $elemMatch: { when: { $lte: ISODate('2015-04-11T18:29:59.999Z'), $gte: ISODate('2015-04-04T18:29:59.999Z') } } } }) 
// added ISOdate()