猫鼬:geoNear和populate。是否可以在使用executeDbCommand时填充字段?

时间:2013-10-22 14:27:08

标签: node.js mongodb mongoose

我正在使用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
})

有什么建议吗?

4 个答案:

答案 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);
    });

});