1

値がセミコロンで区切られている CSV があります。そのCSVのデータをMongoDBデータベースの既存のコレクションに取得する必要がありますが、これはこの問題の場合には実際には関係ありません。

簡単にするために、その CSV からサンプル行を 1 つだけ使用します。

echo '1243;firstName' | sed "s:\([0-9]*\)\;\(.*\):mongo localhost/test --eval \\\\'db.test.update({_id\: \1}, {name\: \"\2\"})\\\\':" | xargs -I {} sh -c "{}"

MongoDB shell version: 2.2.0
connecting to: localhost/test
Thu Apr  4 22:50:10 ReferenceError: firstName is not defined (shell eval):1

問題は、クエリが MongoDB インタープリターに到達したときに、エスケープされていないことです。

各引用符の前に別のバックラッシュを最大 3 つ追加しようとしましたが、何も変わりませんでした。クエリが MongoDB インタープリターに到達するまで引用符がそこにとどまるように、引用符を適切にエスケープするにはどうすればよいですか?

4

1 に答える 1

2

mongoに渡すためにすべてを適切に引用するよりも、直接呼び出す方がはるかに簡単xargsです。

while IFS=';' read id firstName; do
    mongo localhost/test \
      --eval "db.test.update({_id: $id}, {name: \"$firstName\"})"
done < file.csv
于 2013-04-04T23:05:47.707 に答える