我正在使用Mongoose进行地理空间查询,并且还想使用populate()。
我是否正确populate()是一个Mongoose特定命令,并且在使用executeDbCommand时不起作用?我尝试了以下内容:
db.db.executeDbCommand({
geoNear : "geopoints",
near : [long, lat],
populate : 'field', <-- doesn't work
spherical : false,
distanceMultiplier:radPerMile,
maxDistance : maxDis
}, function(err, result){
})
也不是
db.db.executeDbCommand({
geoNear : "geopoints",
near : long, lat],
spherical : false,
distanceMultiplier:radPerMile,
maxDistance : maxDis
}, function(err, result){
}).populate('field', function(err, res){
//also didn't work
})
有什么建议吗?
答案 0 :(得分:1)
以下是我如何做到这一点:
var query = property.geoNear(
[parseFloat(req.params.longitude), parseFloat(req.params.latitude)],
{
spherical : true,
distanceMultiplier: 3959,
maxDistance : parseFloat(req.params.distance)/3959
}, function(err,docs) {
if (err) throw err;
//mapping each doc into new object and populating distance
docs = docs.map(function(x) {
var a = new property( x.obj );
a.distance = x.dis;
return a;
});
// populating user object
property.populate( docs, { path: 'user', select: 'firstname lastname email' }, function(err,properties) {
if (err) res.json(err);
res.json(properties);
});
});
答案 1 :(得分:1)
我的解决方案与&#34; itaylorweb&#34;类似,但不是映射文档,而是简单地填充它。
geoNear结果是对象:
{
dis": 0,
"obj": { refField: someObjectId}
}
请注意,填充的路径不同,必须通过&#34; obj&#34;进行访问。 所以:
var query = property.geoNear(
[parseFloat(req.params.longitude), parseFloat(req.params.latitude)],
{
spherical : true,
distanceMultiplier: 3959,
maxDistance : parseFloat(req.params.distance)/3959
}, function(err,docs) {
if (err) throw err;
// populating user object
// nothice path!
property.populate( docs, { path: 'obj.user', select: 'firstname lastname email' }, function(err,properties) {
if (err) res.json(err);
res.json(properties);
});
});
答案 2 :(得分:1)
我做了类似于Shahaf H.和itaylorweb的事情,但我没有使用回调。相反,我使用了承诺。这是我的自己:
```
let promise = Campground.geoNear(point, options);
promise.then(populateReview)
.then((result)=>{ res.send(result);})
.catch((error)=>{res.status(500).send(error);});
function populateReview(campgrounds) {
return Campground.populate( campgrounds, {path: 'obj.Reviews', select: 'rating'});
}
```
答案 3 :(得分:0)
另一种方式。我不得不改为使用query:{}
来应用where子句property.aggregate().near(
{
near:[parseFloat(req.params.longitude), parseFloat(req.params.latitude)],
distanceField:"distance",
spherical:true,
distanceMultiplier:3959,
maxDistance:parseFloat(req.params.distance)/3959,
query: {
monthlyFee : {
$gte: parseInt(req.params.minPrice),
$lte: parseInt(req.params.maxPrice)
},
numberOfBedrooms : { $gte: parseInt(req.params.minBedrooms) }
}
})
.exec(function(err,docs) {
if (err) res.send(err);
property.populate( docs, { path: 'user', select: 'firstname lastname email' }, function(err,properties) {
if (err) res.json(err);
res.json(properties);
});
});