【问题标题】:How can i use MONGODB aggregation framework with nested external document - Mongoose and NodeJS如何将 MONGODB 聚合框架与嵌套的外部文档一起使用 - Mongoose 和 NodeJS
【发布时间】:2014-05-12 16:34:11
【问题描述】:

我有这些Mongoose 方案:

// 用户架构

exports.User = new Schema({
        name: {
                 type: String,
                 required: true
        },
        home: [{
                type: mongoose.Schema.Types.ObjectId,
                ref: 'Post'
              }]
});

// 发布架构

exports.Post = new Schema({
    likes: [{
        type: Schema.Types.ObjectId,
        ref: 'User'
  }],
    author: {
        id: {
            type: Schema.Types.ObjectId,
            ref: 'User',
            required: true
        },
        name: {
            type: String,
            required: true
        },
        shortId: String, // this is User id 
    },
    created: {
        type: Date,
        default: Date.now,
        required: true
    }
});

//DATABASE 中的数据

// 用户

{"name" : "Mio Nome",
    "home" : [
        ObjectId("533af14b994c3647c5c97338")
    ]}

// 发布

 {  "author" : {
        "id" : ObjectId("533af14b994c3647c5c97338"),
        "name" : "AutoreDelPost"        
    },  
         "likes" : [
              ObjectId("533af14b994c3647c5c97337"),
                  ObjectId("533af14b994c3647c5c97339"),
                  ObjectId("533af14b994c3647c5c97340")
         ]
     }

我想从用户那里获取home 字段中的帖子并计算有多少like拥有一个用户

使用此代码,我可以在populate 的主页上显示所有帖子,但我无法计算喜欢。

req.db.User.find({
            _id: req.user._id   //req.user is my test user
        }, {
            home: 1
        })
            .limit(200)
            .populate('home')
            .exec(function (err) {
                if (!err) {
                    return res.json(200)
                }
                return res.json(500, err)
            });

// 输出

[
    {
        "_id": "533af0ae994c3647c5c97337",
        "name" : "Mio Nome"
        "home": [
            {
                "_id": "533b004e6bcb9105d535597e",
                "author": {
                    "id": "533af14b994c3647c5c97338",
                    "name": "AutoreDelPost"
                },
                "likes": []  // i can't see like and i can't count they
      }        
]

我尝试使用aggregate 来计数等,但我看不到帖子被填充但他们的_id

req.db.User.aggregate({
        $match: {
            _id: req.user._id
        }
    }, {
        $project: {
            home: 1
        }
    }, {
        $unwind: "$home"
    }).exec(function (err, home) {
        if (!err) {

            return res.json(200, home)
        }
        return res.json(500, err)
    });

// 输出

[
    {
        "_id": "533af0ae994c3647c5c97337",
        "home": "533b004e6bcb9105d535597e"
    },
    {
        "_id": "533af0ae994c3647c5c97337",
        "home": "533b004e6bcb9105d5355980"
    },
    {
        "_id": "533af0ae994c3647c5c97337",
        "home": "533b004f6bcb9105d5355982"
    },
    {
        "_id": "533af0ae994c3647c5c97337",
        "home": "533b004f6bcb9105d5355984"
    },
    {
        "_id": "533af0ae994c3647c5c97337",
        "home": "533b00506bcb9105d5355986"
    }
]

QUESTION: 我想从用户那里获取 home 字段的帖子,并统计一个用户有多少赞

【问题讨论】:

  • 它们在两个不同的集合中吗?如果是这样,那么您无法在一个查询中执行此操作,也无法在一个聚合中执行此操作。
  • 为什么需要使用 home 字段?不是每个用户/作者都存储在帖子中吗?为什么不按用户喜欢的次数来汇总帖子分组?
  • 因为我需要home 和其他所有东西

标签: node.js mongodb mongoose aggregation-framework


【解决方案1】:

也许您可以将数据存储得更加非规范化,并添加一个计数器字段,该字段在每个新的“喜欢”时递增。见http://cookbook.mongodb.org/patterns/votes/。比如:

update = {'$push': {'voters': user_id}, '$inc': {vote_count: 1}}

【讨论】:

    猜你喜欢
    • 2014-03-04
    • 2013-01-11
    • 2015-05-29
    • 1970-01-01
    • 2014-02-06
    • 2020-03-08
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多