2016-09-16 58 views
2

假設以下集合定義,其中的例子是這樣的集合中的一個條目:如何讓mongo返回一個字段中的數組?

enumeration : { 
    name: 'enumeration-1' 
    elements: [ 
     { 
      value: 'value-1' 
      tags: ['tag-1', 'tag-2'] 
     }, 
     { 
      value: 'value-2', 
      tags: ['tag-2', 'tag'-3'] 
     }, 
     { 
      value: 'value-3' 
      tags: ['tag-3', 'tag-4'] 
     } 
    ] 
} 

要返回特定的枚舉很簡單:

db.enumerations.find({ name: 'enumeration-1' }) 

不過,我需要增加該查詢返回只有每個元素在標籤列表中至少有一個標籤的元素。考慮以下參數:

1. name: 'enumeration-1' 
2. tags: ['tag-1', 'tag-4'] 

我需要的輸出爲:

['value-1', 'value-3'] 

也就是說,我需要有一個都包含在指定的標籤中的一個或多個元素的唯一值枚舉1.如果可能,查詢會是什麼樣子?返回完整元素也很好。我正在使用Mongo 2.6.9。

+0

我會相應糾正問題。不過,我的意思是你的第一個例子。 – predhme

回答

1

可以使用聚合框架。查找查詢的替代方案是$elemMatch$projection,它們都只支持返回數組中的第一個匹配元素,所以它們不會適用於您的案例,因爲您希望所有的值加上它們不會適用於您的案例(我認爲) 。您需要按數組值進行篩選,但需要其他項目。

但是,它是如何在聚合框架中工作的(如果你需要,你可以做所有的事情,比如使結果唯一等)。

db.enumerations.aggregate(
{$match:{"enumeration.name":"enum-1"}}, 
{$unwind:"$enumeration.elements"}, 
{$unwind:"$enumeration.elements.tags"}, 
{$match:{"enumeration.elements.tags":{$in:["tag-1","tag-4"]}}}, 
{$project:{"enumeration.elements.value":1}}) 
0

不知道這是否會工作(從內存中),但似乎你需要看看$ elemMatch數組查詢,然後看看第二個可選參數來查找,這是投影。

db.enumerations.find({ name: 'enumeration-1', elements : {$elemMatch : { $in : ['tag-1', 'tag-4']}}}, {_id:0, 'elements.value':1}) 
+0

這個查詢我相信是接近的,但不會返回任何結果。我想知道是否因爲'標記'屬性沒有限定符。我修改了查詢,如下所示:db.enumerations.find({name:'enumeration-1',elements:{$ elemMatch:{tags:{$ elemMatch:{$ in:{['tags-1',' tags-4']}}}}}})'。但是,它會返回所有值(包括不是預期的值-2)。 – predhme

1

你可以運行使用set operators作爲一劈(髒的)以下聚合操作以產生修剪元件陣列:

var query = { 
    "name": "enumeration-1", 
    "tags": ["tag-1", "tag-4"] 
}; 

db.enumerations.aggregate([ 
    { "$match": { "name": query.name } }, 
    { 
     "$project": { 
      "name": 1, 
      "elements": { 
       "$setDifference": [ 
        { 
         "$map": { 
          "input": "$elements", 
          "as": "el", 
          "in": { 
           "$cond": [ 
            {           
             "$setEquals": [             
              { 
               "$setIntersection": [ 
                "$$el.tags", query.tags 
               ] 
              }, 
              [] 
             ]           
            },          
            false, 
            "$$el" 
           ] 
          } 
         } 
        }, 
        [false] 
       ] 
      } 
     } 
    } 
]) 
+0

@predhme請讓我知道你爲什麼不接受這個答案?這會給我建設性的批評,這將使我能夠在未來更好地制定我的答案。 – chridam

+1

當我最初接受這個答案時,我在Mongo控制檯內進行了測試,對我來說工作得很好。但是,當我將查詢放入Jongo(我們的mongo框架)時,查詢沒有正確解析,因爲沒有明顯的原因。我搜索了他們的文檔,並嘗試了很多東西,但是從Jongo運行時查詢失敗。我使用的java驅動程序是2.6.9,它與Mongo verison相匹配。我正在使用Jongo 1.2。 – predhme

+0

感謝您的澄清:) – chridam

0
db.enumerations.aggregate([ 
    { $match: {"name":"enumeration-1"} }, 
    { $unwind: "$elements" }, 
    { $unwind: "$elements.tags" }, 
    { $match: {"elements.tags": { $in:["tag-1","tag-4"] } }}, 
    { $group : { _id : null, values: { $push: "$elements.value" } } }, 
    { $project: {"_id":0, values:1}} 
]) 

的輸出,就會像

{ 
    "values" : [ "value-1", "value-3"] 
} 
相關問題