MongoDB中的反向数组字段

时间:2014-02-26 21:41:52

标签: mongodb mongodb-query aggregation-framework

我有一个集合,其中包含以错误顺序输入的位置字段:

location: [38.7633698, -121.2697997]

当我尝试使用...

在场上放置2d索引时
db.collection.ensureIndex({'location': '2d'});

...我收到以下错误,因为纬度和经度相反。

"err" : "location object expected, location array not in correct format",
"code" : 13654

如何为mongo shell中的每个文档反转此数组?

2 个答案:

答案 0 :(得分:5)

db.loc.find().forEach(function (doc) {
    var loc = [ doc.location[1], doc.location[0] ]; 
    db.loc.update(doc, { $set: { location: loc } });
})

答案 1 :(得分:1)

从MongoDB 3.4开始,我们可以使用$reverseArray运算符来完美地完成这项工作。

反转数组:

db.collection.aggregate(
    [ 
        { "$project": { "location": { "$reverseArray": "$location" } } }
    ]
)

产生:

{
    "_id" : ObjectId("576fdc687d33ed2f37a6d527"), 
    "location" : [ -121.2697997, 38.7633698 ] 
}

更新所有文件

要更新集合中的所有文档,您有几个选项。

首先是在管道中添加$out阶段并替换旧集合。在这种情况下,您需要明确包含$project离子阶段中的所有其他字段。 $out阶段看起来像这样:

{ "$out": "collection" }