Находка Локиса дает неправильный ответ - PullRequest
0 голосов
/ 09 апреля 2019

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);

После вставки пары фиктивных данных; Я извлекаю из той же коллекции и назначаю ее переменной templ, называемой "tyrfing";

Теперь вот проблема; Я сделал обновление для свойства владельца с новым значением, названным "upated". даже если я не заставил loki сохранить / обновить до обновления;

Когда я называю find по имени как "tyrfing", он дает ответ как

odins items
[
  {
    "name": "tyrfing",
    "owner": "upated",
    "maker": "dwarves",
    "meta": {
      "revision": 0,
      "created": 1554823595464,
      "version": 0
    },
    "$loki": 3
  }
]

Что неверно, я ожидаю, что имя владельца будет "Svafrlami" в ответе; так как я не сделал ни одного db commit;

Пожалуйста, поправьте меня, если я здесь что-то не так сделал;

Вы можете проверить этот код в Интернете здесь, скопировав это: http://www.obeliskos.com/LokiSandbox/

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

@ Создатель, на самом деле способ LokiJS сделать это - передать опцию clone в конструктор коллекции: docs Вы также можете указать, какой метод клонирования вы хотите использовать.

0 голосов
/ 09 апреля 2019

Я понял это, потратив несколько минут; 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' }));

Я использовал модуль "клонировать" npm для клонирования объекта

Пожалуйста, напишите мне, если есть другие возможности;

...