Mongoose 查询返回带有空数组的嵌套文档

Posted

技术标签:

【中文标题】Mongoose 查询返回带有空数组的嵌套文档【英文标题】:Mongoose query returning nested document with empty array 【发布时间】:2015-12-19 21:13:07 【问题描述】:

我有一个用于 geoJSON 多边形对象的猫鼬模式,结构如下:

var polygonZoneSchema = new mongoose.Schema(
    location: 
        'type': 
            type: String,
            enum: "Polygon",
            default: "Polygon"
        ,
        coordinates: 
            type: [[[Number]]]
        
    ,
    zoneType: ObjectId,
    riskiness: 
        type: Number,
        default: 0
    
);

在我的控制器中,我有一个列出所有多边形的函数:

polyZone.find().exec(function (err, collections) 
        console.log(collections[0].location.coordinates);
        if (err) 
            res.status(400);
            return res.send(reason: err.toString());
        
        res.send(collections);
    );

当通过 mongo 命令行检查我的数据库时,该集合包含:


    "_id": ObjectId("55fb6e7ab228f7343367116d"),
    "location": 
        "type": "Polygon",
        "coordinates": [
            [
                [0, 0],
                [0, 1],
                [1, 1],
                [1, 0],
                [0, 0]
            ]
        ]
    
 
    "_id": ObjectId("55fb6e7ab228f7343367116e"),
    "location": 
        "type": "Polygon",
        "coordinates": [
            [
                [1, 1],
                [1, 2],
                [2, 2],
                [2, 1],
                [1, 1]
            ]
        ]
    

但是,当使用我的控制器函数时,返回的对象有一个空坐标数组:

[
  
    "_id": "55fb6e7ab228f7343367116d",
    "riskiness": 0,
    "location": 
      "coordinates": [],
      "type": "Polygon"
    
  ,
  
    "_id": "55fb6e7ab228f7343367116e",
    "riskiness": 0,
    "location": 
      "coordinates": [],
      "type": "Polygon"
    
  
]

这和猫鼬有关吗?我该如何解决?

【问题讨论】:

【参考方案1】:

事实证明,mongoose 中存在嵌套数组的错误。它已在 4..3 中修复,您可以在此处阅读更多信息 https://github.com/Automattic/mongoose/issues/1361

直到那时我发现通过使用 Model.collection 我可以使用核心 mongo 驱动程序,它对嵌套数组没有任何问题

【讨论】:

【参考方案2】:

是不是因为每个坐标中有 2 个数字而架构只指定了一个? IOW,应该

coordinates: 
        type: [[[Number]]]
    

阅读

coordinates: 
            type: [[[Number, Number]]]
        

【讨论】:

模式指定了一个数字数组,因此第三个内部数组 [Number] 看起来像 [1, 2] 是的,这就是我提出问题的原因,我猜这不应该是答案的形式。 [1,2] 不是数字。您的示例数据在那里显示了 2 个逗号分隔的数字,但您的方案仅指定了一个数字。 模式指定了一个大小为 n 的数字数组。 [], [1], [1, ... , n] 都是有效的例子

以上是关于Mongoose 查询返回带有空数组的嵌套文档的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose - 使用 find() 查询文档,其中嵌套数组值的总和在一定范围内

mongoose - 如何使用带有请求参数数组的 $in 进行 .find()现在它只返回空数组

Mongoose匹配元素或带有$ in语句的空数组

选择带有restangular或angular的嵌套数组元素

在 Mongoose/MongoDB 的文档中过滤数组、子文档、数组、文档

未找到结果时如何从 Mongoose Find 查询返回自定义消息而不是空数组