Docs 菜单
Docs 主页
/ /
数据类型

集 — Node.js SDK

10.5.0 版本中的新增功能

Realm集是一种特殊对象,允许您存储唯一值的集合。 Realm集基于JavaScript ,但只能包含单一类型的值,并且只能在写事务(write transaction)中修改。集合允许您执行数学运算,例如查找两个集合之间的并集、交集或差值。要学习;了解有关执行这些操作的更多信息,请参阅 MDN 文档中的“实施基本设立操作”。

要将属性类型定义为Realm 集,请在该集中指定所需的数据类型,然后指定 <> 。 实例,对于由整数值组成的集合,请指定"int<>"

const characterSchema = {
name: "Character",
primaryKey: "_id",
properties: {
_id: "objectId",
name: "string",
levelsCompleted: "int<>",
inventory: "string<>",
},
};

要创建具有Realm Set属性的对象,您必须在写事务(write transaction)中创建该对象。定义 Realm 对象时,通过传递空数组或具有初始值的数组来初始化Realm 集

let playerOne, playerTwo;
realm.write(() => {
playerOne = realm.create("Character", {
_id: new BSON.ObjectId(),
name: "PlayerOne",
inventory: ["elixir", "compass", "glowing shield"],
levelsCompleted: [4, 9],
});
playerTwo = realm.create("Character", {
_id: new BSON.ObjectId(),
name: "PlayerTwo",
inventory: ["estus flask", "gloves", "rune"],
levelsCompleted: [1, 2, 5, 24],
});
});

要将项目添加到集合中,请将新值传递给写事务(write transaction)中的<Realm.Set>.add()方法。

realm.write(() => {
playerOne.inventory.add("hammer");
playerOne.levelsCompleted.add(32);
});

要确定集合是否包含特定值,请将该值传递给<Realm.Set>.has()方法。 如果集合包含指定的值, set.has()方法将返回 true。

// check if playerTwo has completed level 3 by calling the `has()` method
// on the Realm Set object
const playerTwoHasCompletedLevelThree = playerTwo.levelsCompleted.has(3);
console.log(
`Is level three completed by playerTwo: ${playerTwoHasCompletedLevelThree}`
);

要了解集合中有多少项,可以检查集合的size属性。

// check how many items playerTwo has in his inventory through the `size`
// property of the Realm Set object
const playerTwoInventorySize = playerTwo.inventory.size;
console.log(`playerTwo has ${playerTwoInventorySize} inventory items`);

要从集中删除特定值,请在写事务(write transaction)中将该值传递给<Realm.Set>.delete()方法。

realm.write(() => {
// remove the compass from playerOne's inventory by calling the
// `delete()` method of the Realm Set object within a write transaction
playerOne.inventory.delete("compass");
});

要清除该集合,请在写事务(write transaction)中运行<Realm.Set>.clear()方法。

realm.write(() => {
// clear all data from the inventory slot of playerTwo by calling
// the `clear()` method of the Realm Set object in a write transaction
playerTwo.inventory.clear();
});

要遍历设立,请使用 <Realm.Set>.forEach() 方法或替代迭代方法。

playerOne.inventory.forEach((item) => {
console.log(item);
});

例子

按顺序遍历集合

Realm 集的顺序可能与添加项目的顺序不同。

您可以通过在添加新值时更新数组来追踪设置顺序。例如:

function updateSetAndOrderedSetArray(set, orderedArray, value) {
const oldSize = set.size;
set.add(value);
if (set.size > oldSize) {
orderedArray.push(value);
}
}
let playerOne;
let levelsCompletedInOrder = [];
const realm = await Realm.open({
path: "realm-files/data-type-realm",
schema: [characterSchema],
});
realm.write(() => {
playerOne = realm.create("Character", {
_id: new BSON.ObjectId(),
name: "PlayerOne",
inventory: ["potion", "wand", "spell book"],
levelsCompleted: [],
});
});
realm.write(() => {
updateSetAndOrderedSetArray(
playerOne.levelsCompleted,
levelsCompletedInOrder,
5
);
});
realm.write(() => {
updateSetAndOrderedSetArray(
playerOne.levelsCompleted,
levelsCompletedInOrder,
12
);
});
realm.write(() => {
updateSetAndOrderedSetArray(
playerOne.levelsCompleted,
levelsCompletedInOrder,
2
);
});
realm.write(() => {
updateSetAndOrderedSetArray(
playerOne.levelsCompleted,
levelsCompletedInOrder,
7
);
});
console.log("set ordered", Array.from(playerOne.levelsCompleted)); // not necessarily [5, 12, 2, 7]
console.log("insert ordered", levelsCompletedInOrder); // [5, 12, 2, 7]
// close the realm
realm.close();

后退

字典

在此页面上