Php 嵌套数组字段的Mongodb 2dsphere索引

Php 嵌套数组字段的Mongodb 2dsphere索引,php,mongodb,geolocation,indexing,geospatial,Php,Mongodb,Geolocation,Indexing,Geospatial,我已经创建了一个集合,对象如下所示 [_id] => MongoId Object ( [$id] => 53087f483b15eaeb6c3c9869 ) [time_from] => 2014-02-22 00:00:00 [time_to] => 2014-02-22 00:10:00 [checkin] => Array ( [0] => Array ( [time_frame] => 2014-02-22 00

我已经创建了一个集合,对象如下所示

[_id] => MongoId Object (
    [$id] => 53087f483b15eaeb6c3c9869
)
[time_from] => 2014-02-22 00:00:00
[time_to] => 2014-02-22 00:10:00
[checkin] => Array (
    [0] => Array (
        [time_frame] => 2014-02-22 00:00:56
        [user_id] => 1
        [loc] => Array (
            [type] => Point
            [coordinates] => Array (
                [0] => 73.43
                [1] => 42.22
            )
        )
    )
    [1] => Array (
        [time_frame] => 2014-02-22 00:00:56
        [user_id] => 2
        [loc] => Array (
            [type] => Point
            [coordinates] => Array (
                [0] => 73.10
                [1] => 42.97
            )
        )
    )
}
我需要为“loc”字段创建“2dsphere”索引。签入字段以数组格式存储所有位置坐标

我试着创建如下所示的索引

db.<collection>.ensureIndex( { "checkin.loc" : "2dsphere"  } );

我错过了什么?任何帮助都将不胜感激!提前感谢。

您提供的文档对我来说很不错,我还用您的文档的简短版本做了一个简单的测试,它对我很有用

"_id" : ObjectId("530cb07c009d8c323b477957"),
        "time_from" : ISODate("2014-02-25T15:02:20.714Z"),
        "checkin" : [
                {
                        "user_id" : 1,
                        "loc" : {
                                "type" : "Point",
                                "coordinates" : [
                                        73.43,
                                        42.22
                                ]
                        }
                }
        ]

db.testGeo.ensureIndex( { "checkin.loc" : "2dsphere"  } );
因此,我建议检查集合中的其他文档,其中一些文档的索引格式可能不正确。还要确保坐标数组元素不是字符串。因为此文档对2dsphere索引无效:

"_id" : ObjectId("530cb07c009d8c323b477957"),
            "time_from" : ISODate("2014-02-25T15:02:20.714Z"),
            "checkin" : [
                    {
                            "user_id" : 1,
                            "loc" : {
                                    "type" : "Point",
                                    "coordinates" : [
                                            "73.43",
                                            "42.22"
                                    ]
                            }
                    }
            ]
请注意使坐标元素成为字符串的引号

对评论的回答: Mongo只允许每个集合使用一个地理空间索引。因此,不必为runCommand指定整个字段路径。集合名称足够了。如果集合名称为
checkin\u 20140222

db.runCommand( { geoNear: 'checkin_20140222', near: {type: "Point", coordinates: [73.43, 42.22]}, spherical: true, maxDistance: 40000})

希望有帮助

你提供的文档对我来说很不错,我还用你的文档的一个简短版本做了一个简单的测试,它适合我

"_id" : ObjectId("530cb07c009d8c323b477957"),
        "time_from" : ISODate("2014-02-25T15:02:20.714Z"),
        "checkin" : [
                {
                        "user_id" : 1,
                        "loc" : {
                                "type" : "Point",
                                "coordinates" : [
                                        73.43,
                                        42.22
                                ]
                        }
                }
        ]

db.testGeo.ensureIndex( { "checkin.loc" : "2dsphere"  } );
因此,我建议检查集合中的其他文档,其中一些文档的索引格式可能不正确。还要确保坐标数组元素不是字符串。因为此文档对2dsphere索引无效:

"_id" : ObjectId("530cb07c009d8c323b477957"),
            "time_from" : ISODate("2014-02-25T15:02:20.714Z"),
            "checkin" : [
                    {
                            "user_id" : 1,
                            "loc" : {
                                    "type" : "Point",
                                    "coordinates" : [
                                            "73.43",
                                            "42.22"
                                    ]
                            }
                    }
            ]
请注意使坐标元素成为字符串的引号

对评论的回答: Mongo只允许每个集合使用一个地理空间索引。因此,不必为runCommand指定整个字段路径。集合名称足够了。如果集合名称为
checkin\u 20140222

db.runCommand( { geoNear: 'checkin_20140222', near: {type: "Point", coordinates: [73.43, 42.22]}, spherical: true, maxDistance: 40000})

希望有帮助

谢谢@MaksymStrukov。这真的帮助了我。同样在单个对象中,我在特定的时间间隔内更新用户的签入。我需要检索所有在签入数组中位置坐标附近的用户。例如,
db.runCommand({geoNear:'checkin_20140222.checkin.loc',near:{type:'Point',坐标:[73.43,42.22]},spheremic:true,maxDistance:40000})
但我收到错误消息
[errmsg]=>找不到ns
请帮助我。@rajeshkumarprk查看对我答案的编辑。另外,如果答案有帮助,请将其投上一票,如果它解决了您的问题,请将其标记为答案。谢谢您的回复。我正在同一文档中存储所有地理位置值(对于所有用户)(在签入数组中,请参阅问题中的示例)。因此,我必须在单个对象中使用
geoNear
搜索附近的用户。但是通过使用您的命令,结果将为我显示所有值(用户)。请帮忙。嗯,我想我知道你的问题,但这根本不可能与你目前的设计。要展开数组(将每个数组元素转换为单独的文档),必须使用聚合,但只能将geoNear作为聚合管道的第一阶段。因此,唯一的方法是将每个数组元素存储为单独的文档。对于常见信息,您可以创建一个可供孩子参考的父文档。明白@MaksymStrukov谢谢!我可以将每个数组转换为文档。但我们需要的是,用户一旦签入(存储地理坐标)10分钟,这意味着每次签入记录都会增加。我关心的是当用户数达到百万时的可伸缩性和性能。。。Mongo能不能扩展这个。。应该建立一个分布式数据库系统来处理这个问题吗?谢谢@MaksymStrukov。这真的帮助了我。同样在单个对象中,我在特定的时间间隔内更新用户的签入。我需要检索所有在签入数组中位置坐标附近的用户。例如,
db.runCommand({geoNear:'checkin_20140222.checkin.loc',near:{type:'Point',坐标:[73.43,42.22]},spheremic:true,maxDistance:40000})
但我收到错误消息
[errmsg]=>找不到ns
请帮助我。@rajeshkumarprk查看对我答案的编辑。另外,如果答案有帮助,请将其投上一票,如果它解决了您的问题,请将其标记为答案。谢谢您的回复。我正在同一文档中存储所有地理位置值(对于所有用户)(在签入数组中,请参阅问题中的示例)。因此,我必须在单个对象中使用
geoNear
搜索附近的用户。但是通过使用您的命令,结果将为我显示所有值(用户)。请帮忙。嗯,我想我知道你的问题,但这根本不可能与你目前的设计。要展开数组(将每个数组元素转换为单独的文档),必须使用聚合,但只能将geoNear作为聚合管道的第一阶段。因此,唯一的方法是将每个数组元素存储为单独的文档。对于常见信息,您可以创建一个可供孩子参考的父文档。明白@MaksymStrukov谢谢!我可以将每个数组转换为文档。但我们需要的是,用户一旦签入(存储地理坐标)10分钟,这意味着每次签入记录都会增加。我关心的是当用户数达到百万时的可伸缩性和性能。。。Mongo能不能扩展这个。。应该建立一个分布式数据库系统来处理这个问题吗?