2015-03-31 51 views
1

以下是MongoDB的在mongodb中爲文檔數組查詢的正確方法是什麼?

{ 
"name" : "Tom" , 
"occupation" : "employee" , 
"data" : [ 
     { 
      "owns" : "Television" , 
      "company" : "xyz" 
     }, 
     { 
      "owns" : "Television" , 
      "company" : "abc" 
     }, 
     { 
      "owns" : "laptop" , 
      "company" : "abc" 
     } , 
     { 
      "owns" : "Television" , 
      "company" : "xyz" 
     } 

     ] 
} 

集合,當我查詢

db.exp.find({"data.owns" : "Television"}) 

MongoDB的函數返回一個擁有「擁有」的文件:在結果集「筆記本電腦」。

當我查詢

db.exp.find({"data.owns": "Television"},{_id: 0, data: {$elemMatch: {"owns": "Television"}}}) 

結果僅顯示從數據字段中的一個文件,其中「電視」的第一場比賽中找到

如何查詢來獲取所有3個文件,其中湯姆擁有電視排除便攜式文件。 預期結果

[ 
     { 
      "owns" : "Television" , 
      "company" : "xyz" 
     }, 
     { 
      "owns" : "Television" , 
      "company" : "abc" 
     }, 

     { 
      "owns" : "Television" , 
      "company" : "xyz" 
     } 

] 

注:我在這個例子中,在與原集合了50多個文件中提到只有4在數據字段的文件。 對不起我的英文不好:)。

回答

1

這可以使用aggregation.

  • $unwinddata陣列來完成。
  • 使用$match階段來過濾文件,其中owns的值是Television
  • $group階段重新組織您的文檔。
  • $project階段重塑您的文檔。
db.exp.aggregate(
    [ 
     { "$unwind": "$data" }, 
     { "$match": { "data.owns": "Television" }}, 
     { 
      "$group": { 
          "_id": { 
            "name": "$name", 
            "occupation": "$occupation" 
           }, 
          "data": { "$push": "$data" } 
         } 
     }, 
     { 
      "$project": { 
          "name": "$_id.name", 
          "occupation": "$_id.occupation", 
          "data": 1, 
          "_id": 0 
         } 
     } 
    ] 
) 

結果:

{ 
     "data" : [ 
       { 
         "owns" : "Television", 
         "company" : "xyz" 
       }, 
       { 
         "owns" : "Television", 
         "company" : "abc" 
       }, 
       { 
         "owns" : "Television", 
         "company" : "xyz" 
       } 
     ], 
     "name" : "Tom", 
     "occupation" : "employee" 
} 
1

比方說你有收集兩個文件exp

[ 
    { 
    "name" : "Tom" , 
    "occupation" : "employee" , 
    "data" : [ { "owns" : "Television" , "company" : "xyz" }, 
    { "owns" : "Television" , "company" : "abc" }, 
    { "owns" : "laptop" , "company" : "abc" } , 
    { "owns" : "Television" , "company" : "xyz" } ] 
    }, 
    { 
    "name" : "Jerry" , 
    "occupation" : "employee" , 
    "data" : [ { "owns" : "Mobile" , "company" : "xyz" }, 
    { "owns" : "Mobile" , "company" : "abc" }, 
    { "owns" : "laptop" , "company" : "abc" } , 
    { "owns" : "Laptop" , "company" : "xyz" } ] 
    } 
] 
與您的查詢 db.exp.find({"data.owns" : "Television"})

然後,你會得到

{ "_id" : 101, 
"name" : "Tom", 
"occupation" : "employee", 
"data" : [ 
    { "owns" : "Television", "company" : "xyz" }, 
    { "owns" : "Television", "company" : "abc" }, 
    { "owns" : "laptop", "company" : "abc" }, 
    { "owns" : "Television", "company" : "xyz" } 
] 
} 

作爲第一文檔具有領域owns等於Television時,結果將是完整的第一個文件(包括那些有owns而非Television的字段) 第二個文件不會是部分結果,因爲它沒有任何owns字段,其​​值爲Television

$elemMatch只會返回一個文件。

http://docs.mongodb.org/manual/reference/operator/projection/elemMatch/

如果你只是想在數組中的三個對象具有Television作爲它的值,那麼你可以使用光標來存儲整個結果(在我們的情況下,只有一個文件)查詢。

var x = db.authors.find({"data.owns": "Television"},{_id: 0, "data.owns": 1}) 

而現在,使用每個循環只得到有owns與價值Television的文件。

+0

,而不是在外部應用程序過濾的文件,不是我們能夠做到在數據庫本身這個任務? – 2015-03-31 06:22:24

+0

您可以爲此使用聚合。對不起,我沒有提到答案。 – Rajeshwar 2015-03-31 08:04:12

相關問題