【问题标题】:Lokijs find is giving incorrect responseLokijs 发现给出的响应不正确
【发布时间】:2019-04-09 15:40:03
【问题描述】:

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”的 templ 变量;

现在,问题来了;我使用名为“upated”的新值对所有者属性进行了更新。尽管我没有对更新进行 loki 保存/更新;

当我将 find on name 称为“tyrfing”时,它给出的响应为

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

这是不正确的,我希望响应中的所有者名称为“Svafrlami”;因为我没有进行任何数据库提交;

如果我在这里做错了,请纠正我;

您可以通过复制粘贴在此处在线测试此代码:http://www.obeliskos.com/LokiSandbox/

【问题讨论】:

    标签: node.js lokijs


    【解决方案1】:

    @Creator 实际上 LokiJS 的做法是在集合构造函数中传递 clone 选项:docs 您还可以指定要使用的克隆方法。

    【讨论】:

    • Tx 回复乔,我会试试这个
    • @Creator 如果满足您的问题,请随时将答案标记为正确。
    【解决方案2】:

    花了几分钟后,我想通了; 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 模块来克隆对象

    如果还有其他可能,请给我发帖;

    【讨论】:

      猜你喜欢
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 2014-02-02
      • 1970-01-01
      • 2019-11-02
      • 2011-11-19
      • 1970-01-01
      • 2020-11-03
      相关资源
      最近更新 更多