Ethereum 如何按实体中的多个属性查询结构?

Ethereum 如何按实体中的多个属性查询结构?,ethereum,solidity,truffle,Ethereum,Solidity,Truffle,假设我有以下合同: contract UserContract { struct User { address walletAddress; string organisation; string fName; string lName; string email; uint index; } mapping(address => User) private users;

假设我有以下合同:

contract UserContract {
    struct User {
        address walletAddress;
        string organisation;
        string fName;
        string lName;
        string email;
        uint index;
    }
    mapping(address => User) private users;
    address[] private userIndex;
}
我知道如何编写一个函数,返回与给定
地址对应的用户信息,但我也想编写一个函数,通过
用户的电子邮件地址获取用户信息

这是怎么回事?我唯一的选择是为这个用例创建一个单独的映射,将
用户
结构映射到一个字符串吗?如果是,这是否意味着该结构将被存储两次?或者它只存储对该结构的引用


谢谢

如果您想通过地址或电子邮件(即,不是复合键)进行搜索,那么是的,最简单的选择是使用两种不同的
映射。但是,
struct
值存储为副本(有关如何存储映射的信息,请参阅)

要避免复杂的
结构的额外存储
,请将其存储在数组中,并使用
映射
值的索引

contract UserContract {
    struct User {
        address walletAddress;
        string organisation;
        string fName;
        string lName;
        string email;
        uint index;
    }
    User[] users;
    mapping(address => uint256) private addressMap;
    mapping(string => uint256) private emailMap; // Note this must be private if you’re going to use `string` as the key. Otherwise, use bytes32
    address[] private userIndex;
}

您可以使用for循环,但它需要更多的处理,但for循环可以是一个解决方案,就像一个符咒!非常感谢。