2017-05-07 109 views
0

我有以下数据

[ 
{ 
    "_id": "58fb3b7b78352e228c9e86b5", 
    "item_id": "xxxxx", 
    "sku": "D7C-670-A7B", 
    "price": "40.73", 
    "categoryname": "TV, film e videogiochi", 
    "categoryid": 75708, 
    "__v": 0, 
    "country": "Italy", 
    "specifics": { 
     "NameValueList": [ 
      { 
       "Name": "MPN", 
       "Value": "Does Not Apply", 
       "Source": "ItemSpecific" 
      }, 
      { 
       "Name": "EAN", 
       "Value": "Non applicabile", 
       "Source": "ItemSpecific" 
      }, 
      { 
       "Name": "EAN", 
       "Value": "Non applicabile" 
      }, 
      { 
       "Name": "ISBN", 
       "Value": "Non applicabile" 
      } 
     ] 
    }, 
    "ean": "Non applicabile" 
}, 
{ 
    "_id": "58fb3b7b78352e228c9e86b7", 


    "price": "13.6", 

    "categoryname": "Etuis, housses, coques", 
    "categoryid": 20349, 
    "__v": 0, 
    "country": "France", 

    "specifics": { 
     "NameValueList": [ 
      { 
       "Name": "Compatible Marques", 
       "Value": "Pour Samsung, Apple, pour HTC, pour LG, pour Google", 
       "Source": "ItemSpecific" 
      }, 
      { 
       "Name": "Compatible Modèles", 
       "Value": "iPhone 5, 5S,5C,6,6S", 
       "Source": "ItemSpecific" 
      }, 
      { 
       "Name": "Design/Finition", 
       "Value": "Brillant et Mat", 
       "Source": "ItemSpecific" 
      }, 
      { 
       "Name": "Caractéristiques", 
       "Value": "Étanche, Étui Rigide", 
       "Source": "ItemSpecific" 
      }, 
      { 
       "Name": "MPN", 
       "Value": "Elephant", 
       "Source": "ItemSpecific" 
      }, 
      { 
       "Name": "Matériau Du Produit", 
       "Value": "Polycarbonate Plastique", 
       "Source": "ItemSpecific" 
      }, 
      { 
       "Name": "Type :", 
       "Value": "Fitted Case/Skin", 
       "Source": "ItemSpecific" 
      }, 
      { 
       "Name": "Numéro de pièce fabricant", 
       "Value": "Elephant", 
       "Source": "ItemSpecific" 
      } 
     ] 
    }, 
    "ean": "" 
}] 

我希望得到所有具有

spicifics.NameValueList.Name = "MPN" && spicifics.NameValueList.Name = "Universal" 

我使用$放松身心$汇总查询,但它没有返回的项目中,预期产出。

ebayItems.aggregate([ 
    {$unwind:'$specifics.NameValueList'}, 
    { 
     $group:{"_id":"$item_id"} 
    }, 
    {$project:{"_id":1,"HasMPN":{"$cond":{ 
     "if":{"$eq":["$specifics.NameValueList.Name","MPN"]}, 
     "then":"HasMPN", 
     "else":"NoMPN" 
    }}}} 
]).exec(function(err,item){ 
    if (err) { 
     res.json(err) 
    } else { 
     res.json(item) 
    } 
}) 

上面的输出总是'NoMPN'。上面两个字段的预期输出应该是'HasMPN'。

回答

2

您必须在$group阶段添加要成为响应部分的字段,以便可以在$cond表达式中使用该字段。

您不需要$unwind + $group$cond。您可以仅使用$match来运用$all运算符和$project,_id值来应用标准。基于OP的反馈

aggregate([{ 
     $match: { 
      "specifics.NameValueList.Name": { 
       $all: ["MPN", "Universal"] 
      } 
     } 
    }, 
    { 
     $project: { 
      "_id": 1 
     } 
    } 
]) 

find({"specifics.NameValueList.Name": {$all: ["MPN", "Universal"]}}, {"_id": 1}) 

更新(在名称和值匹配)

find({"specifics.NameValueList":{$elemMatch:{"Name": "MPN","Value":"Universal"}}}, {"_id": 1}) 
+0

感谢其对我的作品,但我需要在那里spicifics.NameValueList.Name =“ MPN“&& spicifics.NameValueList.Name =”Universal“ –

+0

欢迎您。那就是我所拥有的'{“specifics.NameValueList.Name”:{$ all:[“MPN”,“Universal”]}}'。你能提供一个例子吗?更多https://docs.mongodb.com/manual/reference/operator/query/all/#equivalent-to-and-operation – Veeram

+0

对不起,当我运行你的查询时,它所做的是单独找到MPN和Universal,它应该只找到{ “名称”: “MPN”, “值”: “通用”, “源”: “ItemSpecific” } –