1

首先是我的文件的结构:

{
  "_id": "541a8bea74123744b371d38e",
  "geometry": {
    "type": "Point",
    "coordinates": [
      5.3435,
      51.69554
    ]
  },
  "type": "Feature",
  "properties": {
  }
}

问题是我想在 forEach 循环中使用更新函数添加一个字段。循环有效,我可以遍历集合中的每个文档,但更新函数什么也不做。这就是我所拥有的:

var counter = 0;
collection.find({}, {
    stream: true
  })
  .each(function(doc) {
    counter++;
    var hash = geohash.encode(doc.geometry.coordinates[1], doc.geometry.coordinates[0], precision = 9);
    console.log("id: " + doc._id + " hash: " + hash + " counter= " + counter);
    collection.update({
        _id: doc._id
      }, {
        $set: {
          "properties.geohash.precision9": hash
        }
      },
      function(err) {
        if (err) console.log(err);
      }
    );
  })
  .error(function(err) {
    // handle error
    console.log(err);
  })
  .success(function(doc) {
    // final callback
    console.log("added geohash");
    res.send({
      objects: doc
    });
  });

我哪里错了?

4

2 回答 2

1

MongoDb shell 中的工作代码

db.collection.find().forEach(function(item)
{
    var hash = ....;
    item.properties.geohash.precision9 = hash;
    db.collection.save(item);
})

我相信只要做些小改动,你就可以和和尚一起使用

于 2014-10-29T15:23:09.203 回答
1

我相信您的问题与您选择的架构有关。属性是一个子文档,存储在其中的项目可以使用“.”访问,但是您正试图设置另一个子文档 geohash 的属性。Monk 是一个非常轻量级的 MongoDB 驱动程序,不会支持这么多级别的子文档。我建议将您的架构更改为以下内容:

{
  "_id": "541a8bea74123744b371d38e",
  "geometry": {
   "type": "Point",
   "coordinates": [
     5.3435,
     51.69554
   ]
 },
 "type": "Feature",
 "properties": {
 },
"geohash": {
  "precision9": "somevalue"
 }
}

我会尝试通过消除子文档来扁平化文档结构。在我看来,拥有一个称为属性的子文档是多余的,因为有关当前文档的信息直接与父级有关。除非我想念了解您的数据。如果是这种情况,请提供更多存储在您的数据库中的文档,尤其是那些具有 percision9 或其他 3 个深度属性值的文档。

您可能可以做的一件事,虽然有点难看,是使用一个附加变量来构建子文档并分配值“哈希”,然后将属性设置为等于该新变量。除非您正确处理它,否则这将覆盖以前存储在属性中的任何内容:

var newProperties = {
 geohash: {
  presision9: hash
 }
}

collection.update({
        _id: doc._id
      }, {
        $set: {
          "properties": newProperties
        }
      },
      function(err) {
        if (err) console.log(err);
      }
    );
  })

于 2014-12-12T13:21:02.350 回答