0

node-mongodb-nativeを使用する次のコード(簡潔にするためにエラーチェックを削除)があります。

var mongo = require('mongodb').MongoClient;
var grid = require('mongodb').GridStore;
var url = 'mongodb://localhost:27017/mydatabase';

mongo.connect(url, function(err, db) {
    var gs = new grid(db, 'myfile.txt', 'w', {
        "metadata": {
            // metadata here
        }   
    }); 
    gs.open(function(err, store) {
        gs.writeFile('~/myfile.txt', function(err, doc) {
            fs.unlink(req.files.save.path, function (err) {
                // error checking etc
            }); 
        }   
    }); 
}); 

それを実行すると、正常に動作し、ファイルがGridFSに保存されます。

ここで、システムでそのファイルを削除し、同じ名前で内容が異なる新しいファイルを作成し、そのコードを再度実行すると、ファイルがアップロードされます。ただし、GridFSにすでに保存されているファイルを上書きしているようです。_id同じままですがmd5、新しい値に更新されています。したがって、ファイルが異なっていても、名前が同じであるため、GridFSの現在のファイルが上書きされます。

同じ名前の2つのファイルをアップロードする方法はありますか?が一意の場合_id、ドライバーがファイル名のみに基づいてファイルを上書きするのはなぜですか?

GitHubでも同様の問題が見つかりましたが、の最新バージョンのドライバーを使用しておりnpm、上記で説明したことを実行します。

4

2 に答える 2

3

実際のファイルシステムと同様に、ファイル名は、読み取りと書き込みのためのGridFSの論理キーになります。同じ名前のファイルを2つ持つことはできません。

ある種のセカンダリインデックスまたは新しく生成されたファイル名を考え出す必要があります。

たとえば、ファイル名にタイムスタンプを追加します。

または、生成されたファイル名を必要なものにGridFS構造にマップする別のコレクションを作成します。

于 2013-01-13T17:06:50.317 に答える
0

ファイルに追加の一意の識別子を作成する必要をなくすには、「書き込みモード」オプションを省略する必要があります。これにより、まったく同じデータが含まれている場合でも、gridfsが新しいファイルを作成できるようになります。

「w」はデータを上書きするため、既存のファイルを上書きします。

http://mongodb.github.io/node-mongodb-native/api-generated/gridstore.html

于 2014-02-22T12:39:45.937 に答える