在mongodb中为文档数组查询的正确方法是什么?

问题描述:

以下是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在数据字段的文件。 对不起我的英文不好:)。

这可以使用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" 
} 

比方说你有收集两个文件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