在couchdb中使用不同的键发出两次doc

fra*_*rxu 2 couchdb view node.js cradle

假设我有一个用couchDB保存的文档,文档看起来像这样:

{
   "email": "lorem@gmail.com",
   "name": "lorem",
   "id": "lorem",
   "password": "sha1$bc5c595c$1$d0e9fa434048a5ae1dfd23ea470ef2bb83628ed6"
}
Run Code Online (Sandbox Code Playgroud)

我希望能够通过'id'或'email'查询文档.因此,当我将其保存为视图时,我会这样写:

db.save('_design/users', {
    byId: {
        map: function(doc) {
            if (doc.id && doc.email) {
                emit(doc.id, doc);
                emit(doc.email, doc);
            }
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

然后我可以这样查询:

db.view('users/byId', {
    key: key
}, function(err, data) {
    if (err || data.length === 0) return def.reject(new Error('not found'));
    data = data[0] || {};
    data = data.value || {};

    self.attrs = _.clone(data);
    delete self.attrs._rev;
    delete self.attrs._id;

    def.resolve(data);
});
Run Code Online (Sandbox Code Playgroud)

它工作得很好.我可以通过id或加载数据email.但我不确定我是否应该这样做.

我有另一个解决方案,通过保存相同的文档与两个不同的视图,如,byId和byEmail,但这样我保存相同的文档两次,显然它将花费数据库的空间.

不确定哪种解决方案更好.

Kim*_*bel 5

规范的解决方案是拥有两个视图,一个是电子邮件,一个是id.为了不浪费文档的空间,您可以只发出null作为值,然后在include_docs=true查询视图时使用查询参数.

此外,您可能希望使用_id而不是id.这样,CouchDB确保ID是唯一的,您不必使用视图来循环文档.