Вопрос

Assuming I have the following JSON structure I want to group by gender and want to return multiple document values on in the same field:

[
    {
        "id": 0,
        "age": 40,
        "name": "Tony Bond",
        "gender": "male"
    },
    {
        "id": 1,
        "age": 30,
        "name": "Nikki Douglas",
        "gender": "female"
    },
    {
        "id": 2,
        "age": 23,
        "name": "Kasey Cardenas",
        "gender": "female"
    },
    {
        "id": 3,
        "age": 25,
        "name": "Latasha Burt",
        "gender": "female"
    }
] 

Now I know I can do something like this but I need to join both age and name into one field

.aggregate().group({ _id:'$gender', age: { $addToSet: "$age" }, name: { $addToSet: "$name"}})
Это было полезно?

Решение

Yes you can, just have a sub-document as the argument:

db.collection.aggregate([
    { "$group": {
        "_id": "$gender",
        "person": { "$addToSet": { "name": "$name", "age": "$age" } }
    }}
])

Of course if you actually expect no duplicates here the $push does the same thing:

db.collection.aggregate([
    { "$group": {
        "_id": "$gender",
        "person": { "$push": { "name": "$name", "age": "$age" } }
    }}
])

Другие советы

In addition to what Neil mentioned for the aggregation query, you have to consider the fact that the document that contains the grouped individual record cannot be beyond 16 MB (in v2.5+) or the entire aggregate result cannot be more than 16MB (on v2.4 and below).

So in case you have huge data set, you have to be aware of limitations that may impose on the model you use to aggregate data.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top