为啥 mongoosastic 填充/弹性搜索没有填充我的参考资料之一?我得到一个空对象
Posted
技术标签:
【中文标题】为啥 mongoosastic 填充/弹性搜索没有填充我的参考资料之一?我得到一个空对象【英文标题】:Why is mongoosastic populate / elastic search not populating one of my references? I'm getting an empty object为什么 mongoosastic 填充/弹性搜索没有填充我的参考资料之一?我得到一个空对象 【发布时间】:2016-10-12 00:52:13 【问题描述】:我尝试引用两个模型。风格和品牌。
Brand 填充了所需的对象,但 Style 始终为空。
我已尝试清除缓存/删除索引。有无 include_in_parent 和类型:'nested'。
我觉得这可能与指定的 es_type 等有关。不确定。
产品架构:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var Style = require('./style');
var Brand = require('./brand');
var mongoosastic = require('mongoosastic');
var ProductSchema = new mongoose.Schema(
name: type: String, lowercase: true , required: true,
brand: type: mongoose.Schema.Types.ObjectId, ref: 'Brand',
es_type:'nested', es_include_in_parent:true,
style: type: mongoose.Schema.Types.ObjectId, ref: 'Style',
es_schema: Style, es_type:'nested', es_include_in_parent: true,
year: type: Number
);
ProductSchema.plugin(mongoosastic,
hosts: [
'localhost:9200'
],
populate: [
path: 'style',
path: 'brand'
]
);
Product = module.exports = mongoose.model('Product', ProductSchema);
Product.createMapping(function (err,mapping)
if(err)
console.log('error creating mapping (you can safely ignore this)');
console.log(err);
else
console.log('product mapping created!');
console.log(mapping);
);
var stream = Product.synchronize();
var count = 0;
stream.on('data', function()
count++
);
stream.on('close', function()
console.log('indexed whisks ' + count + " documents");
);
stream.on('error', function()
);
样式架构:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var mongoosastic = require('mongoosastic');
var StyleSchema = new mongoose.Schema(
name: type: String, lowercase: true , required: true,
);
Style = module.exports = mongoose.model('Style', StyleSchema);
Style.createMapping(function(err, mapping)
if(err) console.log('error w/ mapping : ', err);
console.log('mapping created');
console.log(mapping);
)
var stream = Style.synchronize();
var count = 0;
stream.on('data', function()
count++
);
stream.on('close', function()
console.log('indexed styles ' + count + " documents");
);
stream.on('error', function()
);
搜索查询:
exports.topSearch = function(req, res)
console.log(req.body, "search product")
Product.search(query_string: query: req.body.search, from: req.body.fromNum,
size: req.body.size,
hydrate: req.body.hydrate
,
function(err, results)
if (err) console.log('ERR', err);
if (results)
var data = results.hits.hits.map(function(hit)
return hit
);
console.log('product data', data)
res.send(data);
else
res.send(errmsg:'results not defined')
);
;
当我查询时,我得到这个结果:
_source:
name: 'Redemption White Rye Whiskey',
brand: [Object],
style: , ,
关于评论请求:
正在添加到数据库的产品:
exports.create = function(req, res)
Product.create(req.body, function(err, product)
if (err)
console.log('ERR', err)
;
res.send(
product: product
);
);
;
正面/角度:
$scope.add = function ()
var prodStyle = JSON.parse($scope.selectedStyle);
$scope.product = $scope.product._id;
$scope.product.style = prodStyle._id;
console.log($scope.product.style, 'prod style');
Product.create($scope.product).then(function (res)
res.data.product.style = name: prodStyle.name ;
$scope.products.push(res.data.product);
$scope.product = ;
$scope.selectedStyle = ;
);
;
【问题讨论】:
你能贴出你用来提交文件的代码吗? 对于 elasticsearch / mongoosastic 查询,或者我如何添加产品?我已经添加了查询和一些附加信息。 对不起,我的意思是添加产品 我可以。分配了正确的对象 ID,我可以使用标准的 mongoose Model.populate。但是,如果它有帮助 - 肯定的。 让我知道您是否正在寻找或者是否需要更多细节。 【参考方案1】:我已经让它工作了,但它与 npm / github 上给出的示例有很大不同。
我不得不删除 es_schema: Style,(就像我不小心为品牌所做的那样,这就是它起作用的原因)。我必须添加我从 elasticsearch 和 mongoosastic 文档中收集的 es_type: "nested" / es_include_in_parent。
我不确定这是有意为之,但它似乎有效:
style: type: mongoose.Schema.Types.ObjectId, ref: 'Style',
es_type:'nested', es_include_in_parent:true,
当我 console.log results.hits 时,我现在根据需要得到 : style: [Object] 。
下面是 npm 中给出的示例,它对我不起作用:
var Comment = new Schema(
title: String
, body: String
, author: String
);
var User = new Schema(
name: type:String, es_indexed:true
, email: String
, city: String
, comments: type: Schema.Types.ObjectId, ref: 'Comment',
es_schema: Comment, es_indexed:true, es_select: 'title body'
)
User.plugin(mongoosastic,
populate: [
path: 'comments', select: 'title body'
]
)
【讨论】:
以上是关于为啥 mongoosastic 填充/弹性搜索没有填充我的参考资料之一?我得到一个空对象的主要内容,如果未能解决你的问题,请参考以下文章