【问题标题】:Mongoose deep populate with MongoosasticMongoose 深填充 Mongoosastic
【发布时间】:2017-07-06 11:04:53
【问题描述】:

我已经阅读了许多 mongoose deep populate 文档和文章,但在这种情况下我似乎无法让它工作,但我有一种感觉,因为当数据被存储时,dealSchema 没有一个身份证。想法?

由于这里的目标是使用 mongoosastic 并在 elasticsearch 中对信息进行索引,因此我将使用插件传递填充参数。

//mongoose version 4.8.0

var dealSchema = new Schema({
    deal: {type: Schema.ObjectId, ref: 'Deal'},
    discounts: [discountSchema]
}, {_id:false});


var offerSchema = new Schema({
    name: String,
    description: String,
    partner: {type: Schema.ObjectId, ref: 'Partner'},
    venues: [{type: Schema.ObjectId, ref: 'Venue'}],
    deals: [dealSchema],
    modified: Date,
    created: Date
});


//=================================================//
mongoose.connect('mongodb://127.0.0.1:27017/production');
offerSchema.plugin(mongoosastic, {
  hosts: [ 'http://127.0.0.1:9200' ],
    index: 'myIndex',
    type: 'offer',
    populate: [
        { path: 'partner', model: 'Partner', select: 'name' },
        { path: 'venues', model: 'Venue', select: 'name' },
        { path: 'deals.deal', model: 'Deal', select: 'name' }
    ]
});

///////// indexed data in ES ///////////
// 1. partners and venues are populated as expected, name only.
// 2. deals.deal is not populated as intended

{
  "_index": "myIndex",
  "_type": "offer",
  "_id": "568454a104439f0300a57e86",
  "_score": 2.1182644,
  "_source": {
    "name": "offer name",
    "description": "This is an offer.",
    "partner": {
      "_id": "566ddbf61e11f0030020fcc5",
      "name": "partner one"
    },
    "venues": [
      {
        "_id": "566df15d1e11f00300211c13",
        "name": "venue one"
      },
      {
        "_id": "566df2f1b6e09103003595a6",
        "name": "venue two"
      }
    ],
    "deals": [
      {
        "deal": "566df755b6e091030035cbed",
        "discounts": [
          {
            "amount": 0,
            "attribute": "566ddeff1e11f0030020fccf"
          },
          {
            "amount": 0,
            "attribute": "566ddef91e11f0030020fcce"
          }
        ]
      }
    ],
    "modified": "2016-05-31T23:04:55.476Z",
    "created": "2015-12-30T22:03:13.354Z"
  }
}

【问题讨论】:

  • 你得到了什么,你期待什么。这个问题似乎不完整
  • 道歉。我得到了一个填充的场地和合作伙伴,仅按预期命名。但是,deals.deal 仍然只是我想要的。没有人口,也没有错误。我回家后会尽快回复。
  • 您确定交易集合中存在交易吗?
  • 已解决:我只需要删除我的 elasticsearch 索引并使用上面显示的 { path: 'deals.deal', model: 'Deal', select: 'name' } 重新导入...谢谢继续回复拉维。
  • @RaviShankar:请不要在此处的标题中使用 [已解决] - 我们不使用它们。谢谢。

标签: mongoose mongoose-populate mongoosastic


【解决方案1】:

下面的代码有效。我需要在重新运行之前删除我的 elasticsearch 索引。

mongoose.connect('mongodb://127.0.0.1:27017/production');
    offerSchema.plugin(mongoosastic, {
      hosts: [ 'http://127.0.0.1:9200' ],
        index: 'myIndex',
        type: 'offer',
        populate: [
            { path: 'partner', model: 'Partner', select: 'name' },
            { path: 'venues', model: 'Venue', select: 'name' },
            { path: 'deals.deal', model: 'Deal', select: 'name' }
        ]
    });

【讨论】:

  • 好吧,我使用相同的代码,当我查询弹性搜索创建的索引时它不会填充。它仍然返回 ObjectId 而不是实际引用的数据。我是否需要使用 mongoosastic/mongoose 为 ref 类型创建自定义映射或任何类似的东西。
  • 它不工作,它返回相同的 ObjectId
【解决方案2】:

(代表 OP 发布)

以这种方式填充实际上会按预期填充deals.deal。因此,当以声明方式填充时,这可能是mongoosastic 问题。

Offer.findOne({'_id': '568454a104439f0300a57e86'}).populate('deals.deal').exec(function(err, doc){
    console.log(JSON.stringify(doc));
});

【讨论】:

    猜你喜欢
    • 2016-05-13
    • 2018-12-12
    • 1970-01-01
    • 2016-03-01
    • 2012-01-22
    • 2013-09-22
    • 2019-01-31
    • 2019-06-25
    • 2019-07-28
    相关资源
    最近更新 更多