我下面有一个对象。
{
"_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' } } } })
任何人都可以帮助我。
答案 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()