如何从sails-mongo原生结果中正确实例化水线模型对象?

时间:2015-10-14 10:54:34

标签: sails.js instantiation waterline case-sensitive sails-mongo

我在项目中使用SailsJS,我需要使用native()来查询某些查询。我遇到的问题是我找不到从mongo集合find结果中实例化水线模型对象的正确方法。我一直在搜索有关这方面的信息,我发现的唯一内容如下:

var instance = new Model._model(mongo_result_item);

这应该可以正常工作,但是当我执行instance.save(function(err, ins){});时,模型会因为" _id"而引发错误。字段,应该是" id"。

我已经看了一下sails-mongo代码,我找到了#34; find"方法他们这样做:

// 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"属性和其他东西。

我现在这样做的方法是要求sails-mongo 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()方法存在问题,其中搜索应区分大小写。模型上的每个字符串字段都用作以下形式的正则表达式匹配:/ ^ {string} $ / i

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

如果有人针对不区分大小写的问题找到了不同的解决方法,请指出正确的方向。

提前致谢。

1 个答案:

答案 0 :(得分:1)

$ regex可能会帮助您使用选项参数搜索不区分大小写的字符串作为“i”,您也可以指定自定义正则表达式以获取更多信息,请参阅$ regex 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);
            });
        });
  }
};

有关本机mongo查询的更多信息,请参阅此处 - https://stackoverflow.com/a/54830760/1828637