如何在node.js中构造一个特定的查询来从mongodb中获取数据?

时间:2016-01-18 20:09:28

标签: node.js mongodb mongoose

我使用mogoosejs并拥有数据模型:

var UserSchema = new Schema({
    username: {type: String, required: true},
    location: {type: [Number], required: true}, // [Long, Lat]
    created_at: {type: Date, default: Date.now},
    updated_at: {type: Date, default: Date.now}
});

现在在该架构上,我想执行一个查询,找到某个区域内的所有用户,所以我这样做了:

var query = User.find({});
if(distance){
    query = query.where('location').near({ center: {type: 'Point', coordinates: [long, lat]},
    maxDistance: distance * 1609.34, spherical: true});
}

这样效果很好,但现在我想在此查询中添加另一个参数 - date。因此,我希望找到特定位置内的所有用户,并在过去16小时内创建了他们的用户...我应该如何修改我的查询以获得所有这些结果? 非常感谢任何线索!

1 个答案:

答案 0 :(得分:1)

要添加日期查询,请创建一个代表16小时前日期时间的日期对象:

var start = new Date();
start.setHours(start.getHours()-16);

现在在查询中使用以上内容:

// get coordinates [ <longitude> , <latitude> ]
var coords = [];
coords[0] = req.query.longitude;
coords[1] = req.query.latitude;
var criteria = { 
        "created_at": { "$gte": start }
        "location": {
            "$near": coords,
            "$maxDistance": distance * 1609.34
        }
    },
    query = User.find(criteria);

如果有机会显示,请使用 moment.js 库,这是一个非常方便的实用程序,用于执行此类操作。要将其用于此类方案,您可以将 subtract() 方法称为:

var start = moment().subtract(16, 'hours'),
    criteria = { "created_at": { "$gte": start }},
    query = User.find(criteria);