2014-09-26 59 views
0

我的结构是这样的,还有更多的值: -添加WHERE条件中总量和组功能在MongoDB中

{ 
    "_id" : ObjectId("542139f31284ad1461dbc15f"), 
    "Category" : "CENTER", 
    "Name" : "STAND", 
    "Url" : "center/stand", 
    "Img" : [ { 
     "url" : "www.google.com/images", 
     "main" : "1", 
     "home" : "1", 
     "id" : "34faf230-43cf-11e4-8743-311ea2261289" 
    }, 
     { 
     "url" : "www.google.com/images1", 
     "main" : "1", 
     "home" : "0", 
     "id" : "34faf230-43cf-11e4-8743-311e66441289" 
    } ] 
} 

我的查询是:

db.MYLIST.aggregate([ 
    { "$group": { 
     "_id": "$Category", 
     "Name": { "$addToSet": { 
      "name": "$Name", 
      "url": "$Url", 
      "img": "$Img" 
     }} 
    }}, 
    { "$sort": { "_id" : 1 } } 
]); 

结果是 - [ { _id: 'CENTER', Name: [ { "name" : "Stand", "url" : "center/stand", "img": { "url" : "www.google.com/images" , "main" : "1", "home" : "1", "id" : "350356a0-43cf-11e4-8743-311ea2261289" } }] }, { _id: 'CENTER', Name: [ { "name" : "Stand", "url" : "center/stand", "img": { "url" : "www.google.com/images1" , "main" : "1", "home" : "0", "id" : "34faf230-43cf-11e4-8743-311ea2261289" } }] } ]

NOW作为IMG数组中的ID是不同的,所以我得到多个相同的类别和名称 但我只想要那个网址,有家= 1即WW w.google.com/images在我的结果中。

预期的结果: - [ { _id: 'CENTER', Name: [ { "name" : "Stand", "url" : "center/stand", "img": { "url" : "www.google.com/images" , "main" : "1", "home" : "1", "id" : "350356a0-43cf-11e4-8743-311ea2261289" } }] }, ]

所以我想添加一个WHERE条件在这里,我只得到名义上有Img.home = 1 任何一个可以帮助我是新来monogodb这些结果。

+0

你想在这里实现什么?你是否真的试图获得每个类别的独特项目?或者你只是试图只获得匹配'“home”= 1'的数组中的项?也许展示你期望的东西。 – 2014-09-26 05:58:06

+0

我想要独特的类别。 然后在类本身,我想找到独特的名字与他们的url和images.LIke这种结构: - [ {_id: '制动', 名称: [对象], [对象], \t] },{ _id: '中心', 名称: [对象], [对象], ]}, ] – 2014-09-26 06:13:18

+0

你是不是真的解释什么' “家”= 1'与此有关。你真的想过滤吗?或者你只是试图解释说,你通过“url”或其他东西来获得“独特”项目。您可以编辑您的问题并添加详细信息。 [对象] [对象]不是一个解释。 – 2014-09-26 06:21:52

回答

0

还真不知道这是你想要的,甚至为什么你会在这个分组上使用$addToSet。但是,如果您只想“过滤”结果中返回的数组的内容,那么在处理一个$unwind流水线以便对内容进行“去归一化”之后,您想要执行的操作是数组元素:

db.MYLIST.aggregate([ 
    // If you only want those matching array members it makes sense to match the 
    // documents that contain them first 
    { "$match": { "Img.home": 1 } }, 

    // Unwind to de-normalize or "un-join" the documents 
    { "$unwind": "$Img" }, 

    // Match again to "filter" out those elements that do not match 
    { "$match": { "Img.home": 1 } }, 

    // Then do your grouping 
    { "$group": { 
     "_id": "$Category", 
     "Name": { 
      "$addToSet": { 
       "name": "$Name", 
       "url": "$Url", 
       "img": "$Img" 
      } 
     } 
    }}, 

    // Finally sort 
    { "$sort": { "_id" : 1 } } 
]); 

所以$match管道一般查询相当于或“where子句”在SQL条款,并可以在任何阶段使用。当由此产生某种类型的过滤时,通常最好将此作为第一阶段。通过减少要处理的文档来减少整体负载,即使不会像使用数组那样删除“全部”最终结果。

$unwind阶段允许像处理另一个文档一样处理数组元素。当然,您可以在此之后使用另一个$match流水线阶段,以便将文档与您的查询条件进行匹配。

+0

因为我想要分类和名称的独特组合。 – 2014-09-26 09:24:08

+0

谢谢,我明白了。 – 2014-09-26 09:51:01