Używam Mongoosewersji 3 z MongoDBwersją 2.2. Zauważyłem, że __vw moich MongoDBdokumentach zaczęło pojawiać się pole . Czy to ma coś wspólnego z wersjonowaniem? Jak to jest używane?
versionKeyJest właściwością ustawić na każdym dokumencie po raz pierwszy stworzony przez Mongoose. Ta wartość kluczy zawiera wewnętrzną wersję dokumentu. Nazwę tej właściwości dokumentu można konfigurować. Domyślnie jest to __v.
Jeśli powoduje to konflikt z aplikacją, możesz skonfigurować jako taki:
Czy można bezpiecznie korzystać z tej właściwości, aby ustalić, czy dokument został właśnie utworzony (np. __v === 0)?
Tabletki przeciwwybuchowe
39
@ExplosionPills do wykorzystania w przyszłości: nie. Klucz wersji jest zwiększany tylko po operacjach, które mogą powodować konflikt, modyfikując pozycje tablic. Inne aktualizacje nie zwiększają tego. Oryginalny post prasowy
Ricardo Tomasi
2
Czy istnieje sposób, aby ukryć go przed zwróconymi dokumentami przed zapytaniami?
diosney
6
@diosney query.select('-__v'). @ExplosionPills należy dodać takie oprogramowanie pośrednie jak mangusta schema.pre('save', function (next) { this.increment(); next(); }).
wprl,
3
@talentedmrjones @wprl To właśnie robię teraz, ale chciałem czegoś, co mógłbym umieścić bezpośrednio w schemacie, więc we wszystkich zapytaniach.
diosney
73
Cóż, nie widzę rozwiązania Tony'ego ... więc muszę sobie z tym poradzić ...
Jeśli nie potrzebujesz wersji_klucza, możesz po prostu:
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});
Ustawienie parametru versionKey na false oznacza, że dokument nie jest już wersjonowany.
Jest to problematyczne, jeśli dokument zawiera tablicę dokumentów podrzędnych. Jeden z dokumentów podrzędnych można usunąć, zmniejszając rozmiar tablicy. Później inna operacja może uzyskać dostęp do dokumentu w tablicy w jego pierwotnej pozycji.
Ponieważ tablica jest teraz mniejsza, może przypadkowo uzyskać dostęp do niewłaściwego dokumentu podrzędnego w tablicy.
VersionKey rozwiązuje ten problem, łącząc dokument z kluczem wersji, używanym wewnętrznie przez mangoose, aby mieć pewność, że uzyska dostęp do właściwej wersji kolekcji.
Odpowiedzi:
Od tutaj :
źródło
__v === 0
)?query.select('-__v')
. @ExplosionPills należy dodać takie oprogramowanie pośrednie jak mangustaschema.pre('save', function (next) { this.increment(); next(); })
.Cóż, nie widzę rozwiązania Tony'ego ... więc muszę sobie z tym poradzić ...
Jeśli nie potrzebujesz wersji_klucza, możesz po prostu:
Ustawienie parametru versionKey na false oznacza, że dokument nie jest już wersjonowany.
Jest to problematyczne, jeśli dokument zawiera tablicę dokumentów podrzędnych. Jeden z dokumentów podrzędnych można usunąć, zmniejszając rozmiar tablicy. Później inna operacja może uzyskać dostęp do dokumentu w tablicy w jego pierwotnej pozycji.
Ponieważ tablica jest teraz mniejsza, może przypadkowo uzyskać dostęp do niewłaściwego dokumentu podrzędnego w tablicy.
VersionKey rozwiązuje ten problem, łącząc dokument z kluczem wersji, używanym wewnętrznie przez mangoose, aby mieć pewność, że uzyska dostęp do właściwej wersji kolekcji.
Więcej informacji można znaleźć na stronie : http://aaronheckmann.blogspot.com/2012/06/mongoose-v3-part-1-versioning.html
źródło
resultFromMongo.toObject({ versionKey: false })
, aby zignorować wartość.schema.set('versionKey', false);
Możemy użyć versionKey: false w definicji schematu
źródło