1

最初に私のドキュメントの構造:

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

問題は、forEach ループで update 関数を使用してフィールドを追加したいということです。ループは機能し、コレクション内のすべてのドキュメントを反復処理できますが、更新機能は何もしません。これは私が持っているものです:

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 シェルで動作するコード

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

いくつかの小さな変更を加えれば、モンクで使用できると思います

于 2014-10-29T15:23:09.203 に答える
1

あなたの問題は、選択したスキーマにあると思います。プロパティはサブドキュメントであり、そこに格納されているアイテムは「.」でアクセスできますが、別のサブドキュメント ジオハッシュのプロパティを設定しようとしています。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 に答える