nodejs gridfs grid.put() с идентичным именем файла перезаписывает файл

Когда я записываю файл в GridFS с помощью grid.put(), который имеет то же имя файла, что и файл, сохраненный ранее, первый файл будет перезаписан. Правда ли, что одно и то же имя файла может существовать только один раз в базе данных, или я что-то не так делаю?

Мой код выглядит так:

var mongo = require('mongodb'),
  Server = mongo.Server,
  Db = mongo.Db,
  Grid = mongo.Grid;
  server = new Server('localhost', 27017, {auto_reconnect: true});
  db = new Db('mydb', server);

db.open(function(err, db) {
  var buffer = new Buffer("This is the first sample text");
  grid.put(buffer, {metadata:{}, filename: "test.txt", content_type: 'text'}, function(err, fileInfo) {
    buffer = new Buffer("This is the second sample text");
    // now this overwrites the first one...
    grid.put(buffer, {metadata:{}, filename: "test.txt", content_type: 'text'}, function(err, fileInfo) {
    });
  });
});

Я думал, что файл определяется уникальным идентификатором ._id ObjectId, а не именем файла. Я ошибаюсь?

Спасибо за вашу помощь!


person heinob    schedule 19.06.2012    source источник


Ответы (2)


Согласно спецификации GridFS файлы индексируются по _id. Имя файла является частью метаданных и не обязательно должно быть уникальным. Если вы поместите что-то с одним и тем же именем файла дважды, вы сможете подтвердить существование обоих файлов, используя список mongofiles из командной строки.

Какую версию драйвера MongoDB Node.js вы используете? Похоже, что несколько месяцев назад была исправлена ​​ошибка драйвера: Не удается сохранить файлы с тем же имя файла в GridFS.

person Stennie    schedule 22.06.2012
comment
Благодарю вас! Это полезный ответ. - person heinob; 22.06.2012

Да, они были перезаписаны, как и в настоящей файловой системе! _id необходим для внутреннего устройства MongoDB (и для стандартных документов), но при работе с файлами GridFS поле _id не имеет значения, имя файла должно быть уникальным.

Также: что вы ожидаете получить, выполнив grid.get? Первый файл? Секунда? Оба вместе?

person TheHippo    schedule 19.06.2012
comment
В вашем вопросе предполагается, что параметром grid.get() является ‹filename›. Но это не так! Согласно документации это ‹ObjectId ›. Так что я бы ожидал получить именно документ с этим _id, несмотря на то, что есть другие документы с таким же именем. - person heinob; 20.06.2012