我正在尝试运行聚合查询并在保存猫鼬模型后将结果保存到搜索引擎。
问题是,我无法弄清楚如何从方法中获取aggregate
函数的引用。我在下面尝试过,但schema.aggregate
未定义。我也直接尝试model.aggregate
,但没有定义。
如何获得对能够运行聚合查询的某个对象的引用?
/**
* Update search index
*/
InventorySchema.post('save', function(model, done){
var query = new ItemUpdateQuery(model.partNumber, model.schema);
query.exec(function(err, result){
if (err) return done(err);
searchUtils.saveDocument('Inventory', result, done);
});
});
/**
* The query updates the inventory index for a specific item. It transforms the corresponding inventory record so it can
* be imported or reimported into the search index.
*
* This was moved into the file to avoid a circular reference issue.
*
* @param partNumber The part number to update.
* @param Schema Reference to the schema to
*/
function ItemUpdateQuery (partNumber, Schema){
return Schema.aggregate(
{"$unwind": "$records"},
{
"$lookup": {
"from": 'locations',
"localField": "records.location",
'foreignField': '_id',
as: 'location'
}
},
{"$lookup": {"from": "items", "localField": "item", 'foreignField': '_id', as: 'item'}},
{"$match": {"$records.enabled": true, "item.partNumber": partNumber}},
{
"$project": {
"_id": "$records._id",
"onHand": "$records.onHand",
"shipped": "$records.shipped",
"allocated": "$records.allocated",
"backOrderAvailable": "$records.backOrderAvailable",
"backOrdered": "$records.backOrdered",
"backOrderEstimatedShipDate": "$records.backOrderEstimatedShipDate",
"enabled": "$records.enabled",
"perpetual": "$records.perpetual",
"location": "$location",
"item": "$item",
"geo": "$records.location.address.geo.location"
}
}
);
};
答案 0 :(得分:1)
如果我正确地理解了这一点,那么你对Schema,Method和Document的定义有点不了解。
模型是从我们的模式定义编译的花哨构造函数。这些模型的实例表示可以从我们的数据库中保存和检索的文档。从数据库创建和检索所有文档都由这些模型处理。
从ItemUpdateQuery函数开始:
return Schema.aggregate()
.aggregate()不是Schema的方法,而是Model的方法。如果我正确地理解了这一点,那么你在这个函数中作为Schema引用的内容实际上应该是一个模型。
然后在这里:
InventorySchema.post('save', function(model, done) {})
此处的回调不是function(model, done)
,而是function(document, done)
。 document是Model的一个实例,因此您可以将您的Model作为document.constructor访问,将aggregate()方法作为document.constructor.aggregate();
或者简而言之:
InventorySchema.post('save', function(document, done) {
//document.constructor references the Model
}