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

Realm.js字符串列表属性查询问题及报错排查

搞定Realm.js数组属性的包含查询问题

嘿,我来帮你解决这个查询Realm数组属性时遇到的问题~先给你拆解下你碰到的两个错误原因,再给你正确的写法:

先说说你俩错误的根源

  • 关于a的错误:你用了=来做相等判断,但Realm的查询语法里必须用==;另外还要确认你的对象是通过Realm的事务创建的(直接给对象赋值属性会出问题,因为Realm对象是受事务管理的)。
  • 关于b的错误:CONTAINS是给字符串用的运算符,不能直接怼在数组(Realm里叫Table类型)上,自然会报错不支持啦。

正确的实现方式

要筛选出book_names包含'B'的Bookrack对象,用ANY配合==就对了,同时要记得所有对象的创建、属性修改都得在Realm的写入事务里操作。给你完整的正确代码示例:

// 定义Bookrack的Schema
const BookrackSchema = { 
  name: 'Bookrack', 
  properties: { 
    book_names:'string[]', 
  } 
};

// 初始化Realm实例
const realm = new Realm({schema: [BookrackSchema]});

// 必须在write事务里创建/修改Realm对象
realm.write(() => {
  // 创建三个书架对象
  realm.create('Bookrack', {book_names: ['A','B','C']});
  realm.create('Bookrack', {book_names: ['B','C','D']});
  realm.create('Bookrack', {book_names: ['C','D','E']});
});

// 正确的查询语句
const targetBookracks = realm.objects('Bookrack').filtered(`ANY book_names == $0`, 'B');
console.log(targetBookracks); // 这里就会返回你想要的Bookrack1和Bookrack2啦

额外小技巧

  • 如果需要忽略大小写查询(比如不管是'B'还是'b'都能匹配到),可以用CONTAINS[c],写法是这样的:
    const caseInsensitiveResult = realm.objects('Bookrack').filtered(`ANY book_names CONTAINS[c] $0`, 'b');
    
  • ANY的作用就是检查数组里有没有至少一个元素满足条件,完全符合你要找包含'B'的需求~

内容的提问来源于stack exchange,提问作者lsdoy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:43:55