You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Realm DB中合并两个Schema并实现类似SQL JOIN的关联操作

嘿,我明白你想在Realm里实现类似SQL JOIN的查询效果,这确实和SQL的思路不太一样——因为Realm是面向对象的NoSQL数据库,它靠对象关系来替代传统的JOIN操作。我来一步步帮你搞定:

1. 先修改Schema,建立对象关联

Realm的关联是通过对象引用实现的,你的stok已经把StokNo设为主键了,我们可以直接在barkod Schema里添加一个指向stok的属性,让两个对象自动关联:

const barkod = { 
  name: 'barkod', 
  properties: { 
    StokNo: { type: 'int', indexed: true }, 
    Barkod: { type: 'string', indexed: true }, 
    Birim: 'string', 
    BarkodTipi: 'string', 
    Aciklama: 'string?', 
    YStokNo: 'int',
    // 新增:关联到stok对象,Realm会自动通过StokNo主键匹配
    stok: { type: 'stok', optional: true } 
  } 
}

注意:如果你的数据库已经有存量数据,需要做一次数据迁移——遍历所有barkod对象,根据StokNo找到对应的stok对象,赋值给barkod.stok即可。

如果是一对多关系(一个stok对应多个barkod),还可以在stok Schema里添加反向关联,方便从stok端查询所有对应的barkod:

const stok = { 
  name: 'stok', 
  primaryKey: 'StokNo', 
  properties: { 
    StokNo: 'int', 
    StokAdi: { type: 'string', indexed: true }, 
    StokKisaAdi: 'string', 
    StokKodu: 'string', 
    StokTanimi: 'string', 
    GrupKodu: 'string', 
    KdvOranP: { type: 'int', default: 0 }, 
    KDVOranT: { type: 'int', default: 0 }, 
    OzelKodu1: 'string', 
    OzelKodu2: 'string', 
    OzelKodu3: 'string',
    // 新增:反向关联所有属于当前stok的barkod
    barkods: { type: 'list', objectType: 'barkod' } 
  } 
}

2. 执行类似JOIN的查询

有了对象关联后,你可以直接查询barkod,然后通过它的stok属性获取对应的库存信息,完全达到你要的SQL查询效果:

方式一:查询所有关联数据

// 打开Realm实例
const realm = await Realm.open({ schema: [barkod, stok] });

// 提取你需要的字段:StokAdi(来自stok)、Barkod、StokNo(来自barkod)
const joinedResults = realm.objects('barkod').map(barkodItem => ({
  StokAdi: barkodItem.stok?.StokAdi, // 用可选链处理stok不存在的情况
  Barkod: barkodItem.Barkod,
  StokNo: barkodItem.StokNo
}));

console.log(joinedResults);

方式二:带条件的筛选查询

如果你需要像SQL的WHERE子句一样筛选数据(比如找StokNo为100的记录):

const filteredResults = realm.objects('barkod')
  .filtered('StokNo = 100') // 筛选条件
  .map(barkodItem => ({
    StokAdi: barkodItem.stok?.StokAdi,
    Barkod: barkodItem.Barkod,
    StokNo: barkodItem.StokNo
  }));

3. 不想修改Schema的替代方案

如果因为某些限制不能修改现有Schema,你可以手动做关联查询,但这种方式性能会差一些(数据量大时更明显):

const realm = await Realm.open({ schema: [barkod, stok] });

// 先获取所有barkod
const allBarkods = realm.objects('barkod');
// 逐个匹配对应的stok
const joinedResults = allBarkods.map(barkodItem => {
  // 通过StokNo查找对应的stok
  const matchedStok = realm.objects('stok').filtered(`StokNo = ${barkodItem.StokNo}`)[0];
  return {
    StokAdi: matchedStok?.StokAdi,
    Barkod: barkodItem.Barkod,
    StokNo: barkodItem.StokNo
  };
});

小提示:优先推荐修改Schema建立对象关联的方式,Realm会对这种关联查询做性能优化,比手动匹配高效得多。

内容的提问来源于stack exchange,提问作者Aysegul Bozdag Firat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 20:47:31