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)吃水果芒果或香蕉记录的人总数。
对于这样的模式,运行像您所需要的那样的性质的查询将会非常困难。考虑改变模式,使得每个子文档都有一个主键,例如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
}
chrisdam - 感谢您的详细解答。但是,在您的帖子中粘贴聚合查询方法时会发生某些错误。它没有正常运行。如果您通过详细的说明解释上述任何一项查询,我将非常感谢您。 – joshi
@joshi不用担心伴侣。在运行聚合查询之前,您是否设法更改架构?抱歉,我不能很好地解释每条聚合流水线的含义,因为您需要的查询数量非常少,我认为您知道聚合框架概念,因此我深入了解了实现的原因。 – chridam
@chrisdam - 是的,我在db模式中做了这种改变。但无法运行聚合查询。一些括号从我认为是的位置错位。因为我对这个商店感到陌生并试图采用自己的MongoDB框架。因此,对我来说,在汇总查询中特别容易地查看代码,但我非常感谢您的快速回复。 – joshi
请出示你的努力(即代码)第一。 –
我在特定的fruit-db.season.find({“spring.person_id”:{“$ elemMatch”:{“$ gt”:101,“$ lt”:104}}}中找出了person_id的范围。 ); – joshi