如何在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
相关产品推荐
相关产品推荐

