mongoose node.js中的聚合函数没有返回记录

时间:2014-12-15 09:13:21

标签: node.js mongodb mongodb-query aggregation-framework

我见过几个与此相关的问题。但无法找到可以帮助我的答案。

这是我使用mongoose的服务器端node.js代码。此代码只是在控制台中打印“成功获取数据[]”。

var kmphDBSchema = commonRouter.kmphDBSchema;
    var locationSchema = new kmphDBSchema({result:{locations:{id:String,parent_id:String,countryCode:String,name:String}}});
    var locationModel = commonRouter.kmphMongoClient.model('mgh_locations',locationSchema);

exports.getLocations =  function(request, response) { 
    var locationName = '/.*' + request.params.locationName + '.*/';
    console.log("locationName: " + locationName);

    locationModel.aggregate(
        [
           { $unwind:"$locations"}
          ,{ $project:{_id:0,locations:1} }
          ,{ $match:{"locations.name": locationName}}
       ]
      , function (err, res) {
        console.log('Error=' + err); 
          if (err){
            console.log('Error in fetching locations' + err);
            return (err);
          }
          console.log('Success in fetching data' + JSON.stringify(res)); 
          response.send(JSON.stringify(res));
    });
}

以下是mongo shell中查询返回的数据。 使用mongoose从node.js获取数据时,不会返回此数据。

/* 0 */
{
    "result" : [ 
        {
            "locations" : {
                "id" : "1",
                "parent_id" : "531",
                "countryCode" : "IN",
                "name" : "Noida"
            }
        }, 
        {
            "locations" : {
                "id" : "407",
                "parent_id" : "531",
                "countryCode" : "IN",
                "name" : "Greater Noida"
            }
        }
    ],
    "ok" : 1
}.

这是原始的JSON文档

/* 0 */
{
    "_id" : ObjectId("548b15d700dcf350ea6a9e1e"),
    "locations" : [ 
        {
            "id" : "1",
            "parent_id" : "531",
            "countryCode" : "IN",
            "name" : "Noida"
        }, 
        {
            "id" : "2",
            "parent_id" : "531",
            "countryCode" : "IN",
            "name" : "New Delhi"
        }, 
        {
            "id" : "3",
            "parent_id" : "531",
            "countryCode" : "IN",
            "name" : "Gurgaon"
        }, 
        {
            "id" : "11",
            "parent_id" : "0",
            "countryCode" : "IN",
            "name" : "Agra"
        }, 
        {
            "id" : "12",
            "parent_id" : "0",
            "countryCode" : "IN",
            "name" : "Jaipur"
        }, 
        {
            "id" : "13",
            "parent_id" : "0",
            "countryCode" : "IN",
            "name" : "Hyderabad"
        }, 
        {
            "id" : "14",
            "parent_id" : "0",
            "countryCode" : "IN",
            "name" : "Lucknow"
        }, 
        {
            "id" : "15",
            "parent_id" : "0",
            "countryCode" : "IN",
            "name" : "Kanpur"
        }, 
        {
            "id" : "16",
            "parent_id" : "0",
            "countryCode" : "IN",
            "name" : "Lansdowne"
        }, 
        {
            "id" : "18",
            "parent_id" : "0",
            "countryCode" : "IN",
            "name" : "Bangalore"
        }, 
        {
            "id" : "19",
            "parent_id" : "0",
            "countryCode" : "IN",
            "name" : "Nainital"
        }, 
        {
            "id" : "20",
            "parent_id" : "0",
            "countryCode" : "IN",
            "name" : "Bhimtal"
        }, 
        {
            "id" : "21",
            "parent_id" : "0",
            "countryCode" : "IN",
            "name" : "Kolkata"
        }
]
}

1 个答案:

答案 0 :(得分:0)

当这是一个匹配的搜索词时,或许可以为其他人提供更多说明。

作为ODM或(对象文档映射器)接口,Mongoose库在其功能中具有某些方面,可能会使不谨慎的人感到困惑。最常见的方面显然是"命名"模特Mongoose遵循一种模式,该模式使用模型名称作为" Object"的表示。在"复数"形式何时命名"默认情况下的集合。这会导致一些问题。

这里使用的库会导致一些常见的变形。因此,使用以下示例:

 var mongoose = require("mongoose"),
     Schema = mongoose.Schema;


 var personSchema = new Schema({
     "name": String,
     "tile": STring
 });

 mongoose.model( "Person", personShema );

期待"模型"在集合存储中应该称为people。这是使用的库赋予的标准EN或英语语言变形。但是有一个"默认"处理这种情况存在于猫鼬图书馆本身采用的基本方法中。由于该功能实际上接受了"三个"参数,"第三"与集合名称明确匹配,而不是默认"复数"。

mongoose.model( "Person", personSchema, "Person" );

现在collection实际上被命名为Person而不是People,因此更像是您所期望的。

Fair3注意到"默认"行动正是良好编程实践所期望的。 "模型"这是一个"单数"类表示,"集合"底层代表"很多"这些"对象"在一个集合中,基本上是隐含的。所以这是正确的做法。

如果您正在使用"型号"到已经定义了它的结构"集合"名称,然后使用"第三"在实例化对象时指定该名称的参数。这使得引擎清楚并且还可以读取代码。