为啥 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 填充/弹性搜索没有填充我的参考资料之一?我得到一个空对象的主要内容,如果未能解决你的问题,请参考以下文章

节点js中的REST api,用于使用弹性搜索进行全文搜索

为啥 jquery 数据表在搜索后没有填充新更新的数据?

如何在没有 flashvars 的情况下使用 JavaScript 自动填充弹性输入?

为啥我的弹性物品没有包装?

为啥 select2 没有用最新数据填充控件?

没有写入时,为啥 Elasticsearch 每隔“n”秒执行一次索引?