4

我在一个项目上使用SailsJS,我需要为某些查询使用native()。我遇到的问题是,我无法从mongo集合find的结果中找到正确的方式来实例化水线模型对象。我已经被搜索这方面的信息,我发现的唯一的事情是:如何从sails-mongo原生结果正确实例化Waterline模型对象?

var instance = new Model._model(mongo_result_item); 

这应该正常工作,但是当我做instance.save(function(err, ins){});模型抛出一个错误,因为“_id”字段,应是“id”。

我已经拍了一下成帆 - 蒙戈代码,我发现,对于“发现”的方法,他们这样做:

// Run Normal Query on collection 
collection.find(where, query.select, queryOptions).toArray(function(err, docs) { 
    if(err) return cb(err); 
    cb(null, utils.normalizeResults(docs, self.schema)); 
}); 

所以normalizeResults确实神奇的“_id”属性,和其它东东。

我现在这样做的权利的方式是要求帆 - 蒙戈utils.js文件才能访问此方法。

全样本:

var mongoUtils = require('sails-mongo/lib/utils.js'); 

SampleModel.native(function(nativeErr, collection){ 

    collection.find({ 'field' : value }).toArray(function(collectionErr, results){ 
     if (!results || results.length == 0) return res.restfullInvalidFieldValue({ msg : 'INVALID_VALUE' }); 

     var norm_results = mongoUtils.normalizeResults(results); 
     var instance = new SampleModel._model(norm_results[0]); 

    }); 

}); 

是否有实现这一美好/有道?

我需要进行本机搜索,因为我发现使用字符串的Waterline find()方法存在问题,其中搜索应区分大小写。在模型中的每个字符串字段被用来作为形式的正则表达式匹配:/^{串} $ /我

用不区分大小写的标志会给我的问题正则表达式搜索。另一方面,{field:{$ regex:new RegExp('^'+ regexp_escaped_string +'$')}}可能是可能的,但我认为它会比{field:value}更差。

如果有人已经找到了不区分大小写的问题,不同的解决方法,请点我在正确的方向。

在此先感谢。

+0

我是Sails的新手,但在Sails.js的Gitter页面上我有一些帮助。你可能想尝试那里。 [Gitter Page](https://gitter.im/balderdashy/sails) –

回答

0

$正则表达式可以帮助你使用选项paramteter作为搜索不区分大小写字符串“我”,也可以指定自定义的正则表达式,而不是更多的信息,请参阅$正则表达式MongoDB的文档。

/** 
* PetController 
* 
* @description :: Server-side logic for managing pets 
* @help  :: See http://links.sailsjs.org/docs/controllers 
*/ 

module.exports = { 
    searchByName: function (req,res) { 

     Pet 
     .native(function(err, collection) { 
      if (err) return res.serverError(err); 

      collection.find(
      { 
       name: { $regex: /like-my-name/, $options: "i" } // here option "i" defines case insensitive 
      }, 
      { 
       name: true 
      }) 
      .toArray(function (err, results) { 
       if (err) return res.serverError(err); 

       return res.ok(results); 
      }); 
     }); 
    } 
};