【问题标题】:aggregate function in mongoose node.js returning no recordmongoose node.js 中的聚合函数不返回任何记录
【发布时间】:2025-12-10 08:45:02
【问题描述】:

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

这是我使用猫鼬的服务器端 node.js 代码。此代码只是在控制台中打印“Success in fetching data[]”。

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"
        }
]
}

【问题讨论】:

  • 您需要澄清您的问题。 “标题”说“没有返回”,但你显示了一个结果。所以不知道你在说什么。
  • 感谢您的快速回复。没有打印数据。在控制台中,日志语句只是打印“获取数据成功[]”。没有打印出确切的数据。更新问题以获得更多说明
  • 新帐户。请使用详细信息编辑您的问题,而不是尝试在 cmets 中添加更多内容。只需评论并“标记”您想要提醒您的编辑的人。您似乎在问您的聚合在 mongoose 中给 shell 提供了不同的结果。我不认为您真正发布了所有相关代码,因为您发布的内容应该是一样的。
  • 我又更新了问题。
  • 我怀疑mongoose的“复数”代码才是真正的罪魁祸首。 Mongoose 模型采用“三个”参数。试试:mongoose.model('mgh_locations',locationSchema,'mgh_locations')。指定时可能会得到正确的集合。

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


【解决方案1】:

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

作为 ODM 或(Object Document Mapper)接口,Mongoose 库的某些功能可能会使粗心的人感到困惑。最常见的方面显然是模型的“命名”。 Mongoose 遵循一种模式,默认情况下“命名”集合时,使用模型名称作为“复数”形式的“对象”表示。这会导致一些问题。

这里使用的库导致了一些常见的变形。因此用下面的例子:

 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 注意,“默认”操作正是良好编程实践所期望的。这里的“模型”是一个“单一的”类表示,而底层的“集合”表示集合中的“许多”这些“对象”,这基本上是暗示的。所以这是正确的做法。

如果您将“模型”应用于已经定义了“集合”名称的结构,则在实例化对象时使用“第三个”参数指定该名称。这让引擎和阅读您的代码。

【讨论】: