2017-10-16 101 views
0

我正在研究在聚合管道MongoDB中查詢嵌入文檔數組的不同方法。看起來MongoDB對此的支持較少。在聚合管道中查詢嵌入文檔的mongo數組

比方說,我們在測試收集下列文件:

/* 1 */ 
    { 
    "_id" : ObjectId("59df2c39fbd406137d4290b3"), 
    "a" : 1.0, 
    "arr" : [ 
     { 
      "key": 1, 
      "sn" : "a", 
      "org": "A" 
     } 
    ] 
    } 

/* 2 */ 
{ 
    "_id" : ObjectId("59df2c47fbd406137d4290b4"), 
    "a" : 2.0, 
    "arr" : [ 
     { 
      "sn" : "b", 
      "key": 2, 
      "org": "B" 
     } 
    ] 
} 

/* 3 */ 
{ 
    "_id" : ObjectId("59df2c50fbd406137d4290b5"), 
    "a" : 3.0, 
    "arr" : [ 
     { 

      "key": 3, 
      "sn" : "c", 
      "org": "C" 
     } 
    ] 
} 

/* 4 */ 
{ 
    "_id" : ObjectId("59df2c85fbd406137d4290b6"), 
    "a" : 1.0, 
    "arr" : [ 
     { 
      "key": 1, 
      "sn" : "a", 
      "org": " A" 
     } 
    ] 
} 

/* 5 */ 
{ 
    "_id" : ObjectId("59df2c9bfbd406137d4290b7"), 
    "a" : 3.0, 
    "arr" : [ 
     { 
      "sn" : "b", 
      "key": 2, 
     } 
    ] 
} 

/* 6 */ 
{ 
    "_id" : ObjectId("59df2e41fbd406137d4290b8"), 
    "a" : 4.0, 
    "arr" : [ 
     { 
      "sn" : "b", 
      "key" : 2 
     } 
    ] 
} 

/* 7 */ 
{ 
    "_id" : ObjectId("59df2e5ffbd406137d4290b9"), 
    "a" : 5.0, 
    "arr" : [ 
     { 
      "key" : 2, 
      "sn" : "b" 
     }, 
     { 
      "sn" : "a", 
      "key" : 1 
     } 
    ] 
} 

,我想分類基於上述文檔中使用下面的查詢「arr.sn」字段值:

db.test.aggregate([{"$addFields": {"Category" : { $switch: { 
    branches : [ 
     { case : { $eq : [ "$arr.nm", "a" ] }, then : "Category 1"} 
    ], 
    default : "No Category" 
    }}}}]) 

但$ eq運算符沒有給出正確的結果,如果我在查找方法中使用相同的$ eq,它可以工作:

db.test.find({"arr.sn" : "a"}) 

我正在尋找只用單個字段的方式,在這裏是「arr.sn」字段。有沒有什麼方法可以從數組中的嵌入式文檔中投射字段?

任何幫助,將不勝感激。

回答

1

$eq(aggregation)比較與查詢eq操作員不同的值和類型,它可以比較任何類型的值。您需要$in(aggregation)來驗證數組中的值。

喜歡的東西

[ 
    { 
    "$addFields": { 
     "Category": { 
     "$switch": { 
      "branches": [ 
      { 
       "case": { 
       "$in": [ 
        "a", 
        "$arr.sn" 
       ] 
       }, 
       "then": "Category 1" 
      } 
      ], 
      "default": "No Category" 
     } 
     } 
    } 
    } 
] 
+0

感謝@Veeram您的解決方案,實際上是在$操作要求所有數組字段是存在,但是我在看的方式,只有單場做到這一點,在這裏案「 arr.sn「字段。我修改了有問題的數組條目。有沒有什麼方法可以從數組中的嵌入式文檔中投射字段? –

+0

Np。我沒跟着你。你是什​​麼意思單場? 'arr.sn'返回值數組,'$ in'在值數組中查找值。我錯過了什麼 ? – Veeram

+0

你的溶液作品而不是在陣列包括下面嵌入的文檔 對於離的情況下:ARR:[{ 「鍵」:1, 「SN」: 「一」, 「組織」: 「A」 }] 。 –