2017-02-14 3 views
0

Я использую Mongoose внутри стека MEAN и сталкиваются с проблемой при применении Like query. Я попробовал много вариантов, доступных через интернет-помощь, но ничего не работало для меня.Как применить запрос в Mongoose?

Ниже приводится модель для моей схемы:

var mongoose = require('mongoose'); 

var ItemTransactionSchema = new mongoose.Schema({ 
    tid : Number, 
    sku_id: Number, 
    num_iid: Number, 
    sub_order_tax_fee: String, 
    status:String, 
    price:Number, 
    invoice_no:String, 
    payment:Number, 
    cid:String, 
    adjust_fee:Number, 
    store_code:String, 
    discount_fee:Number, 
    total_fee:Number, 
    barcode:String, 
    itemdump:String, 
    end_time:Date, 
    storename:String, 
    logistics_company:String 
}); 

var item_transaction = mongoose.model('item_transaction', ItemTransactionSchema, 'item_transaction'); 

Вот код, я использую, чтобы применить запрос:

var re = new RegExp(searched_key_word, 'i'); 

item_transaction.find({ "tid": { $regex: re }}, function (err, value) { 
if (err) { 
    callback(err, null); 
} 
else { 
    callback(null, value); 
} 
}).select('-_id').limit(parseInt(limit)); 

Пожалуйста, обратите внимание, что мой запрос работает хорошо и возвращать записи, если я не добавляйте { "tid": { $regex: re } в сторону find()

Вот вид item_transaction коллекции:

> db.item_transaction.find() 
{ "_id" : ObjectId("589dc1a3a46d1e96709db2c2"), "tid" : NumberLong("951107967214387"), "sku_id" : NumberLong("85864385869"), "num_iid" : NumberLong("45316210625"), "sub_order_tax_fee" : 
0, "status" : "TRADE_FINISHED", "price" : 195, "invoice_no" : "JL100296682", "payment" : 195, "cid" : 50011975, "adjust_fee" : 0, "store_code" : "", "discount_fee" : 0, "total_fee" : 1 
95, "barcode" : NumberLong("670983077667"), "itemdump" : "{\"consign_time\": \"2015-05-27 09:52:14\", \"sku_id\": \"85864385869\", \"refund_status\": \"NO_REFUND\", \"seller_type\": \"B 
\", \"sub_order_tax_fee\": \"0.00\", \"num\": 1, \"outer_sku_id\": \"670983077667\", \"shipping_type\": \"express\", \"is_daixiao\": false, \"logistics_company\": \"WnDirect\", \"sku_pr 
operties_name\": \"u989cu8272u5206u7c7b:u7c89u7ea2u8272;u9ad8u5ea6:31CM\", \"title\": \"u82f1u56fdu8fdbu53e3jellycatu5bb3u7f9eu7cfbu5217u7c89u8272u90c1u91d1u9999u90a6u5c3cu5154u8d85u67d 
4u8f6fu6bdbu7ed2u73a9u5177u516cu4ed4\", \"snapshot_url\": \"h:951107967214387_1\", \"sub_order_tax_rate\": \"0\", \"order_from\": \"TAOBAO\", \"status\": \"TRADE_FINISHED\", \"price\": 
\"195.00\", \"oid\": 951107967214387, \"buyer_rate\": false, \"invoice_no\": \"JL100296682\", \"payment\": \"195.00\", \"seller_rate\": false, \"cid\": 50011975, \"discount_fee\": \"0.0 
0\", \"adjust_fee\": \"0.00\", \"num_iid\": 45316210625, \"is_oversold\": false, \"end_time\": \"2015-06-16 09:52:34\", \"total_fee\": \"195.00\", \"pic_path\": \"http://img04.taobaocdn 
.com/bao/uploaded/i4/TB1yryuHVXXXXaRXVXXXXXXXXXX_!!0-item_pic.jpg\"}", "end_time" : "2015-06-16 09:52:34", "storename" : "TMALL", "logistics_company" : "WnDirect" } 
{ "_id" : ObjectId("589dc1a3a46d1e96709db2c3"), "tid" : NumberLong("967597019777082"), "sku_id" : NumberLong("91148011839"), "num_iid" : NumberLong("45361707245"), "sub_order_tax_fee" : 
0, "status" : "TRADE_FINISHED", "price" : 195, "invoice_no" : "JL100306378", "payment" : 195, "cid" : 50011975, "adjust_fee" : 0, "store_code" : "", "discount_fee" : 0, "total_fee" : 1 
95, "barcode" : NumberLong("670983073997"), "itemdump" : "{\"consign_time\": \"2015-06-24 09:57:50\", \"sku_id\": \"91148011839\", \"refund_status\": \"NO_REFUND\", \"seller_type\": \"B 
\", \"sub_order_tax_fee\": \"0.00\", \"num\": 1, \"outer_sku_id\": \"670983073997\", \"shipping_type\": \"express\", \"is_daixiao\": false, \"logistics_company\": \"WnDirect\", \"sku_pr 
operties_name\": \"u989cu8272u5206u7c7b:u94f6u8272;u9ad8u5ea6:u4e2du53f7 - u9ad831cm\", \"title\": \"u82f1u56fdu8fdbu53e3jellycatu7ecfu5178u5bb3u7f9eu7cfbu5217u5bb3u7f9eu90a6u5c3cu5154u 
94f6u8272u8d85u67d4u8f6fu6bdbu7ed2u73a9u5177u516cu4ed4\", \"snapshot_url\": \"h:967597019777082_1\", \"sub_order_tax_rate\": \"0\", \"order_from\": \"WAP,WAP\", \"status\": \"TRADE_FINI 
SHED\", \"price\": \"195.00\", \"oid\": 967597019777082, \"buyer_rate\": false, \"invoice_no\": \"JL100306378\", \"payment\": \"195.00\", \"seller_rate\": false, \"cid\": 50011975, \"di 
scount_fee\": \"0.00\", \"adjust_fee\": \"0.00\", \"num_iid\": 45361707245, \"is_oversold\": false, \"end_time\": \"2015-07-10 09:17:15\", \"total_fee\": \"195.00\", \"pic_path\": \"htt 
ps://img.alicdn.com/bao/uploaded/i3/TB1nPmtHVXXXXXfaXXXXXXXXXXX_!!0-item_pic.jpg\"}", "end_time" : "2015-07-10 09:17:15", "storename" : "TMALL", "logistics_company" : "WnDirect" } 
{ "_id" : ObjectId("589dc1a3a46d1e96709db2c4"), "tid" : NumberLong("1075205771411026"), "sku_id" : NumberLong("85662450758"), "num_iid" : NumberLong("45315502492"), "sub_order_tax_fee" 
: 0, "status" : "TRADE_FINISHED", "price" : 100, "invoice_no" : "JL100301165", "payment" : 100, "cid" : 50011975, "adjust_fee" : 0, "store_code" : "", "discount_fee" : 0, "total_fee" : 
100, "barcode" : NumberLong("670983062595"), "itemdump" : "{\"consign_time\": \"2015-06-04 10:15:09\", \"sku_id\": \"85662450758\", \"refund_status\": \"NO_REFUND\", \"seller_type\": \" 
B\", \"sub_order_tax_fee\": \"0.00\", \"num\": 1, \"outer_sku_id\": \"670983062595\", \"shipping_type\": \"express\", \"is_daixiao\": false, \"logistics_company\": \"WnDirect\", \"sku_p 
roperties_name\": \"u989cu8272u5206u7c7b:u7c73u8272;u9ad8u5ea6:13cm\", \"title\": \"u82f1u56fdu8fdbu53e3jellycatu7ecfu5178u5bb3u7f9eu7cfbu5217 u7ecfu5178u6b3eu90a6u5c3cu5154u7c73u8272u8 
+1

Возможный дубликат [Как запросить MongoDB с "как"?] (Http://stackoverflow.com/questions/3305561/how-to-query-mongodb-with-like) –

+1

HTTP: // stackoverflow.com/questions/30722650/mongoose-find-regexp-for-number-type-field – Vishnu

+0

@Naeem Shaikh Я пробовал решения на http://stackoverflow.com/questions/3305561/how-to-query-mongodb -with-like –

ответ

1

Я использовал его, как это, чтобы преобразовать число «Путь/столбца» в строке на время выполнения.

item_transaction.find({ "$where": "function() { return this.tid.toString().match(/"+searched_key_word+"/) != null; }" }, function (err, value) { 
    if (err) { 
     callback(err, null); 
    } 
    else { 
     callback(null, value); 
    } 
}).select('-_id').limit(parseInt(limit)); 
1

Насколько я заинтересован, вы можете запускать регулярные выражения только в строках. Таким образом, у вас есть два варианта здесь:

Вариант 1 - Превратите поле TID в строке, то вы можете запускать команды, как следующее:

db.item_transaction.find({tid: { $regex : /"yourRegex"/ }}) 

Это будет делать свою работу. Единственный недостаток, который у вас есть, - это преобразовать ваши тиды в строку (что, я полагаю, вас не сильно беспокоит, так как вы все еще моделируете).

Вариант 2 - Поиск с использованием $ gt и $ lt. Если то, что вы хотите, действительно является числом, вы можете использовать операторы $ gt (больше, чем) и $ lt (меньше) для извлечения чисел в диапазоне. Я бы не советовал это делать, поскольку это не регулярное выражение, но я просто говорю вам ради знания. Вы можете использовать его как это:

db.item_transaction.find({ tid: {$gt : 100} }) 

Надеюсь, мой ответ был полезным