Mongo' _id'字段未在ElasticSearch中添加

时间:2015-01-17 13:59:57

标签: mongodb elasticsearch mongoose elasticsearch-plugin mongoosastic

我正在使用ElasticSearch和mongoosastic在MongoDB和ElasticSearch之间同步数据。

我遇到的问题是,当我对ElasticSearch中的数据进行搜索时,它不会返回对象的'_id'属性。很可能是因为我错误地告诉它,但我找不到任何文档。

我告诉mongoosastic从Mongo同步到ElasticSearch的对象的虚拟示例如下所示:

var userSchema = new mongoose.Schema({
        name: {type:String,es_indexed:true},
        phone: {type:String,es_indexed:true},
        settings:{type:[String],es_indexed:true,index:'not_analyzed'}
}, {id: true});

userSchema.plugin(mongoosastic,settings.elasticSearch);

var User = mongoose.model('User', userSchema);

User.createMapping(function(err, mapping){
    if(err){
        console.log('error creating User mapping (you can safely ignore this)');
        console.log(err);
    }else{
        console.log('User mapping created!');
        console.log(mapping);
    }
});

当我在ElasticSearch上运行 _search 时,我会得到具有以下结构的结果

    {
        "_index": "users",
        "_type": "user",
        "_id": "54b3ea9619160d0b0080d751",
        "_score": 1,
        "_source": {
           "name": "John Smith",
           "phone": "JohnSmith@gmail.com",
           "settings": []
        }
     }

如何将mongo对象的_id放入_source对象?

1 个答案:

答案 0 :(得分:0)

没有使用 mongoosastic 的内置方法。

我总是使用 map 函数和传播语法(...) 将 _id 与所有其他字段连接起来:

let results = results.map(r => { return { '_id': r._id, ...r._source} } )

另一种选择是使用 hydration,但它会慢得多,因为它会对 MongoDB 进行额外查询。