How to hide _id from Aggregation?

后端 未结 4 1135
广开言路
广开言路 2020-12-30 21:25

I\'ve this query:

produits = yield motor.Op(db.users.aggregate, [{\"$unwind\":\"$pup\"},{\"$match\":{\"pup.spec.np\":nomp}}, {\"$group\":{\"_id\":\"$pup.spec         


        
相关标签:
4条回答
  • 2020-12-30 22:00

    From mongodb docs

    You can $project the results to exclude the _id - is this what you mean?

    http://docs.mongodb.org/manual/reference/aggregation/#pipeline

    Note The _id field is always included by default. You may explicitly exclude _id as follows:

    db.article.aggregate(
        { $project : {
            _id : 0 ,
            title : 1 ,
            author : 1
        }}
    );
    

    From you're example, the first operation in the pipeline would be to exclude the _id and include the other attribs.

    0 讨论(0)
  • 2020-12-30 22:02

    This is not exaclty a mongoWay of doing it, but you can use this factory to generate an object that includes all but _id

    /**
     * Factory that returns a $project object that excludes the _id property https://docs.mongodb.com/v3.0/reference/operator/aggregation/project/ 
     * @params {String} variable list of properties to be included  
     * @return {Object} $project object including all the properties but _id
     */
    function includeFactory(/* properties */){
        var included = { "_id": 0 };
        Array.prototype.slice.call(arguments).forEach(function(include){
            included[include] = true
        })
    
        return { "$project": included }
    }
    

    Then use it like this:

    cities.aggregate(
    { "$group": { "_id": null, "max": { "$max": "$age" }, "min": { "$min": "$age" }, "average": { "$avg": "$age" }, "total": { "$sum": "$count" } } },
            includeFactory('max','min','average','total') 
    )
    
    0 讨论(0)
  • 2020-12-30 22:03

    I'm not familiar with motor, but you ought to be able to delete the property from the results dict directly.

    >>> produits = {u'ok': 1.0, u'result': [{u'_id': None, u'pup': [{u'avt': {u'fto': 'whatever'}}]}]}
    >>> prod = produits['result'] 
    >>> del prod[0]['_id']
    >>> print prod
    [{u'pup': [{u'avt': {u'fto': 'whatever'}}]}]
    
    0 讨论(0)
  • 2020-12-30 22:14

    Starting Mongo 4.2, the $unset aggregation operator can be used as an alternative syntax for $project when used to only drop fields:

    // { _id: "1sd", pup: [{ avt: { fto: "whatever"} }] }
    // { _id: "d3r", pup: [{ avt: { fto: "whatever else"} }] }
    db.collection.aggregate({ $unset: ["_id"] })
    // { pup: [{ avt: { fto: "whatever" } } ] }
    // { pup: [{ avt: { fto: "whatever else" } } ] }
    
    0 讨论(0)
提交回复
热议问题