2017-02-15 47 views
0

我蒙戈表,其中所含收集「商店」和數據的形式大致如下:使用過濾器的Mongo查詢沒有獲取確切的結果?

{ 
    "ShopId" : 9999, 
    "products" : [ 
     { 
      "productId" : "1234", 
      "productName" : "abcd", 
     }, 
     { 
      "productId" : "5678", 
      "productName" : "abc", 

     }, 
     { 
      "productId" : "2345", 
      "productName" : "def", 

     } 

    ], 
} 

將有幾家商店在表中有一個產品列表。

要求:

我想獲取其shopId = 9999個產品記錄匹配字符串ABC

我查詢

model.Shops.aggregate([{$match:{"ShopId":9999}},{$project:{products:{$filter:{input:'$products',cond: {'productName':/abc/ }}}}}]) 

問題:

它將productname:defproductname:abc匹配的其他數據提取出來。

回答

1

您不能使用$filter運算符使用正則表達式搜索。實現這一目標的唯一途徑就是放鬆products,過濾文檔,然後再組他們在一個數組

model.Shops.aggregate([ 
    { 
     $match:{ 
     "ShopId":9999 
     } 
    }, 
    { 
     $unwind:"$products" 
    }, 
    { 
     $match:{ 
     "products.productName":/abc/ 
     } 
    }, 
    { 
     $group:{ 
     _id:null, 
     products:{ 
      $push:{ 
       "productName":"$products.productName", 
       "productId":"$products.productId" 
      } 
     } 
     } 
    } 
]) 

輸出:

{ 
    "_id":null, 
    "products":[ 
     { 
     "productName":"abcd", 
     "productId":"1234" 
     }, 
     { 
     "productName":"abc", 
     "productId":"5678" 
     } 
    ] 
} 

用一個變量來使用它,聲明你的正則表達式是這樣:

var regex: /abc/; 

,然後在查詢中直接使用它

$match:{ 
     "products.productName": regex 
     } 
+0

查詢執行正常。但我還有一個疑問..如果我必須爲匹配而不是'abc'放置一個公共變量。我應該在'/ /'之間放置什麼。是/ searchValue /或/ + searchValue +/ –

+0

@midhunk看到我的編輯 – felix

+0

不,它不工作.... :( –

0

對於我來說,下面的代碼在mongoshell上工作,而且你的代碼給我帶來了錯誤,即$ filter的'as'參數缺失。

db.Shops.aggregate([ 
{$match:{"ShopId":9999}}, 
{$project:{ 
    products:{$filter:{input:'$products',as:"product",cond: { $eq: [ "$$product.productName", "abc" ] }}} 
    }} 
])