Lokijs дает неверный ответ поиска в среде Node JS
Вот пример из интернета:
// This database has already been created for you.
// var db = new loki('sandbox');
// Add a collection to the database
var items = db.addCollection('items');
// Add some documents to the collection
items.insert({ name : 'mjolnir', owner: 'thor', maker: 'dwarves' });
items.insert({ name : 'gungnir', owner: 'odin', maker: 'elves' });
items.insert({ name : 'tyrfing', owner: 'Svafrlami', maker: 'dwarves' });
items.insert({ name : 'draupnir', owner: 'odin', maker: 'elves' });
// Find and update an existing document
var tyrfing = items.findOne({'name': 'tyrfing'});
tyrfing.owner = 'upated';
// These statements send to Text Output
logText('tyrfing value :');
logObject(tyrfing);
logText('tyrfing items');
logObject(items.find({ 'name': 'tyrfing' }));
// This statement sends to Inspector
inspectObject(db);
После вставки пары фиктивных данных; Я извлекаю данные из той же коллекции и присваиваю их временной переменной под названием «tyrfing»;
Теперь вот проблема; Я обновил свойство владельца с новым значением под названием «upated». хотя я не заставлял локи сохранять/обновлять до обновления;
Когда я назвал поиск по имени как «tyrfing», он дает ответ как
odins items
[
{
"name": "tyrfing",
"owner": "upated",
"maker": "dwarves",
"meta": {
"revision": 0,
"created": 1554823595464,
"version": 0
},
"$loki": 3
}
]
Что неверно, я ожидаю, что в ответе имя владельца будет «Свафрлами»; так как я не делал никаких коммитов в БД;
Пожалуйста, поправьте меня, если я сделал что-то не так;
Вы можете протестировать этот код онлайн здесь, скопировав это: http://www.obeliskos.com/LokiSandbox/
Я понял это, потратив несколько минут; items.find
возвращает фактическую/реальную ссылку на объект; поэтому, если я внесу какие-либо изменения, они также отразятся в оригинале;
Так что я клонировал исходный объект, который я получил от находки, а затем внес изменения в клонированный объект, и это сработало :)
Вот код:
var clone = require('clone');
// Find and update an existing document
var tyrfing = items.findOne({'name': 'tyrfing'});
var temptyrfing = clone(tyrfing);
temptyrfing.owner = 'upated';
// These statements send to Text Output
logText('tyrfing value :');
logObject(temptyrfing);
logText('tyrfing items');
logObject(items.find({ 'name': 'tyrfing' }));
Я использовал модуль «clone» npm для клонирования объекта.
Пожалуйста, напишите мне, если есть другие возможности;
@Creator на самом деле способ LokiJS сделать это - передать параметр clone
в конструкторе коллекции: документы
Вы также можете указать, какой метод клонирования вы хотите использовать.
@Creator не стесняйтесь помечать ответ как правильный, если он удовлетворил ваш вопрос.
Tx для ответа Джо, я попробую это