Я использую Mongooseверсию 3 с MongoDBверсией 2.2. Я заметил, что __vполе начало появляться в моих MongoDBдокументах. Это как-то связано с версионированием? Как это используется?
versionKeyЭто свойство устанавливается на каждый документ , когда первый созданный Мангуст. Это значение ключа содержит внутреннюю редакцию документа. Имя этого свойства документа настраивается. По умолчанию это __v.
Если это конфликтует с вашим приложением, вы можете настроить его следующим образом:
Безопасно ли использовать это свойство, чтобы определить, был ли документ только что создан (например __v === 0)?
Таблетки взрыва
39
@ExplosionPills для дальнейшего использования: нет. Ключ версии увеличивается только после операций, которые могут вызвать конфликт, изменяя положения массива. Другие обновления не будут увеличивать его. Оригинальный пост релиза объясняет это в деталях: aaronheckmann.tumblr.com/post/48943525537/…
Рикардо Томази,
2
Есть ли способ скрыть это от возвращенных документов от запросов?
diosney
6
@diosney query.select('-__v'). @ExplosionPills вам нужно будет добавить mongoose middleware, как schema.pre('save', function (next) { this.increment(); next(); }).
wprl
3
@talentedmrjones @wprl Это именно то, что я делаю сейчас, но я хотел что-то, что я мог бы вставить в схему напрямую, так во всех запросах.
diosney
73
Ну, я не вижу решения Тони ... поэтому я должен разобраться с этим сам ...
Если вам не нужен version_key, вы можете просто:
varUserSchema=new mongoose.Schema({
nickname:String,
reg_time:{type:Date,default:Date.now}},{
versionKey:false// You should be aware of the outcome after set to false});
Установка для versionKey значения false означает, что документ больше не является версионным.
Это проблематично, если документ содержит массив вложенных документов. Один из вложенных документов можно удалить, уменьшив размер массива. Позже другая операция может получить доступ к вложенному документу в массиве в исходном положении.
Поскольку массив теперь меньше, он может случайно получить доступ к неверному поддокументу в массиве.
VersionKey решает эту проблему, связывая документ с ключом versionKey, который внутренне используется в mongoose для обеспечения доступа к нужной версии коллекции.
Ответы:
От сюда :
источник
__v === 0
)?query.select('-__v')
. @ExplosionPills вам нужно будет добавить mongoose middleware, какschema.pre('save', function (next) { this.increment(); next(); })
.Ну, я не вижу решения Тони ... поэтому я должен разобраться с этим сам ...
Если вам не нужен version_key, вы можете просто:
Установка для versionKey значения false означает, что документ больше не является версионным.
Это проблематично, если документ содержит массив вложенных документов. Один из вложенных документов можно удалить, уменьшив размер массива. Позже другая операция может получить доступ к вложенному документу в массиве в исходном положении.
Поскольку массив теперь меньше, он может случайно получить доступ к неверному поддокументу в массиве.
VersionKey решает эту проблему, связывая документ с ключом versionKey, который внутренне используется в mongoose для обеспечения доступа к нужной версии коллекции.
Дополнительную информацию можно найти по адресу: http://aaronheckmann.blogspot.com/2012/06/mongoose-v3-part-1-versioning.html.
источник
resultFromMongo.toObject({ versionKey: false })
, чтобы уменьшить значение.schema.set('versionKey', false);
Мы можем использовать versionKey: false в определении схемы
источник