MongoDB中找到查询

问题描述:

seasons.jsonMongoDB中找到查询

{ 
    "_id" : "unique_1", 
    "spring" : [{ 
     "fruit" : "mango", 
     "person_id" : [101.0, 102.0, 103.0, 104.0] 
    }, { 
     "fruit" : "banana", 
     "person_id" : [151.0, 152.0, 153.0, 154.0] 
    }], 
    "summer" : [{ 
     "fruit" : "mango", 
     "person_id" : [201.0, 202.0, 203.0, 204.0] 
    }, { 
     "fruit" : "banana", 
     "person_id" : [251.0, 252.0, 253.0, 254.0] 
    }], 
    "fall" : [{ 
     "fruit" : "mango", 
     "person_id" : [301.0, 302.0, 303.0, 304.0] 
    }, { 
     "fruit" : "banana", 
     "person_id" : [351.0, 352.0, 353.0, 354.0] 
    }], 
    "winter" : [{ 
     "fruit" : "mango", 
     "person_id" : [401.0, 402.0, 403.0] 
    }, { 
     "fruit" : "banana", 
     "person_id" : [451.0, 452.0, 453.0] 
    }] 
} 

/* 2 */ 
{ 
    "_id" : "unique_2", 
    "spring" : [{ 
     "fruit" : "banana", 
     "person_id" : [151.0, 152.0, 153.0, 154.0] 
    }], 
    "summer" : [{ 
     "fruit" : "mango", 
     "person_id" : [201.0, 202.0, 203.0, 204.0] 
    }, { 
     "fruit" : "banana", 
     "person_id" : [251.0, 252.0, 253.0, 254.0] 
    }], 
    "fall" : [{ 
     "fruit" : "banana", 
     "person_id" : [351.0, 352.0, 353.0, 354.0] 
    }], 
    "winter" : [{ 
     "fruit" : "mango", 
     "person_id" : [401.0, 402.0, 403.0] 
    }, { 
     "fruit" : "banana", 
     "person_id" : [451.0, 452.0, 453.0] 
    }] 
} 

以上JSON记录显示哪个季节哪个人吃了芒果和具有食用香蕉。

这是我想要找什么: 当我知道_id预先记录的(主键)或记录发现之前 -

1)全部为person_id从101 - 350中为person_id是独特 2)person_id只吃芒果 3)吃水果芒果或香蕉记录的人总数。

+0

请出示你的努力(即代码)第一。 –

+0

我在特定的fruit-db.season.find({“spring.person_id”:{“$ elemMatch”:{“$ gt”:101,“$ lt”:104}}}中找出了person_id的范围。 ); – joshi

对于这样的模式,运行像您所需要的那样的性质的查询将会非常困难。考虑改变模式,使得每个子文档都有一个主键,例如seasons,其可以具有四个不同的阵列元素,即春季,夏季,冬季和秋季。架构改成这样:

/* 1 */ 
{ 
    "_id" : "unique_1", 
    "seasons" : [ 
     { 
      "name" : "spring", 
      "fruits" : [ 
       { 
        "name" : "mango", 
        "person_id" : [ 
         101, 
         102, 
         103, 
         104 
        ] 
       }, 
       { 
        "name" : "banana", 
        "person_id" : [ 
         151, 
         152, 
         153, 
         154 
        ] 
       } 
      ] 
     }, 
     { 
      "name" : "summer", 
      "fruits" : [ 
       { 
        "name" : "mango", 
        "person_id" : [ 
         201, 
         202, 
         203, 
         204 
        ] 
       }, 
       { 
        "name" : "banana", 
        "person_id" : [ 
         251, 
         252, 
         253, 
         254 
        ] 
       } 
      ] 
     }, 
     { 
      "name" : "fall", 
      "fruits" : [ 
       { 
        "name" : "mango", 
        "person_id" : [ 
         301, 
         302, 
         303, 
         304 
        ] 
       }, 
       { 
        "name" : "banana", 
        "person_id" : [ 
         351, 
         352, 
         353, 
         354 
        ] 
       } 
      ] 
     }, 
     { 
      "name" : "winter", 
      "fruits" : [ 
       { 
        "name" : "mango", 
        "person_id" : [ 
         401, 
         402, 
         403 
        ] 
       }, 
       { 
        "name" : "banana", 
        "person_id" : [ 
         451, 
         452, 
         453 
        ] 
       } 
      ] 
     } 
    ] 
} 

有了这个模式就变得更容易运行下面的聚集查询:

1)全部为person_id从101 - 350,其中PERSON_ID是唯一

var pipeline1 = [ 
    { "$match": { "_id": "unique_1" }, 
    { "$unwind": "$seasons" }, 
    { "$unwind": "$seasons.fruits" }, 
    { "$unwind": "$seasons.fruits.person_id" }, 
    { 
     "$match": { 
      "seasons.fruits.person_id": { 
       "$gte": 101, 
       "$lte": 350 
      } 
     } 
    },  
    { 
     "$group": { 
      "_id": 0, 
      "person_ids": { 
       "$addToSet": "$seasons.fruits.person_id" 
      } 
     } 
    }, 
    { 
     "$project": { 
      "_id": 0, 
      "person_ids": 1 
     } 
    } 
]; 

db.season.aggregate(pipeline1); 

输出

/* 1 */ 
{ 
    "result" : [ 
     { 
      "person_ids" : [ 
       304, 
       253, 
       201, 
       251, 
       301, 
       203, 
       252, 
       204, 
       152, 
       102, 
       202, 
       154, 
       254, 
       101, 
       302, 
       153, 
       104, 
       103, 
       303, 
       151 
      ] 
     } 
    ], 
    "ok" : 1 
} 

2)PERSON_ID只吃芒果

var pipeline2 = [ 
    { "$match": { "_id": "unique_1" }, 
    { "$unwind": "$seasons" }, 
    { "$unwind": "$seasons.fruits" }, 
    { "$unwind": "$seasons.fruits.person_id" }, 
    { 
     "$match": { 
      "seasons.fruits.name": "mango" 
     } 
    },  
    { 
     "$group": { 
      "_id": 0, 
      "person_ids": { 
       "$addToSet": "$seasons.fruits.person_id" 
      } 
     } 
    }, 
    { 
     "$project": { 
      "_id": 0, 
      "person_ids": 1 
     } 
    } 
]; 

db.season.aggregate(pipeline2); 

输出

/* 1 */ 
{ 
    "result" : [ 
     { 
      "person_ids" : [ 
       402.0000000000000000, 
       304.0000000000000000, 
       303.0000000000000000, 
       302.0000000000000000, 
       301.0000000000000000, 
       204.0000000000000000, 
       202.0000000000000000, 
       201.0000000000000000, 
       203.0000000000000000, 
       104.0000000000000000, 
       102.0000000000000000, 
       103.0000000000000000, 
       403.0000000000000000, 
       401.0000000000000000, 
       101.0000000000000000 
      ] 
     } 
    ], 
    "ok" : 1 
} 

3)的人总数在记录吃水果或者芒果或香蕉。

var pipeline3 = [ 
    { "$match": { "_id": "unique_1" }, 
    { "$unwind": "$seasons" }, 
    { "$unwind": "$seasons.fruits" }, 
    { "$unwind": "$seasons.fruits.person_id" }, 
    { 
     "$match": { 
      "seasons.fruits.name": { 
       "$in": ["mango", "banana"] 
      } 
     } 
    },  
    { 
     "$group": { 
      "_id": "$_id", 
      "count": { 
       "$sum": 1 
      } 
     } 
    }, 
    { 
     "$project": { 
      "_id": 0, 
      "count": 1 
     } 
    } 
]; 

db.season.aggregate(pipeline3); 

输出

/* 1 */ 
{ 
    "result" : [ 
     { 
      "count" : 30 
     } 
    ], 
    "ok" : 1 
} 
+1

chrisdam - 感谢您的详细解答。但是,在您的帖子中粘贴聚合查询方法时会发生某些错误。它没有正常运行。如果您通过详细的说明解释上述任何一项查询,我将非常感谢您。 – joshi

+0

@joshi不用担心伴侣。在运行聚合查询之前,您是否设法更改架构?抱歉,我不能很好地解释每条聚合流水线的含义,因为您需要的查询数量非常少,我认为您知道聚合框架概念,因此我深入了解了实现的原因。 – chridam

+1

@chrisdam - 是的,我在db模式中做了这种改变。但无法运行聚合查询。一些括号从我认为是的位置错位。因为我对这个商店感到陌生并试图采用自己的MongoDB框架。因此,对我来说,在汇总查询中特别容易地查看代码,但我非常感谢您的快速回复。 – joshi