【问题标题】:MongoDB Aggregation Framework $Project additional ObjectId reference fieldMongoDB 聚合框架 $Project 附加 ObjectId 引用字段
【发布时间】:2013-03-13 18:14:10
【问题描述】:

假设我有以下内容:

this.aggregate(
    {$unwind: "$tags"},
    {$match: {tags: {$in: pip.activity.tags}}},
    {$group : {_id : '$_id',matches:{$sum:1}}},
    {$project: { _id: 0,matches:1}},
    {$sort: {matches:-1 }},
    callback
);

我将如何在结果中包含一个额外的“外部”objectId 字段?例如,如果我有以下情况:

var otherField = new ObjectId('xxxxxxx');
this.aggregate(
    {$unwind: "$tags"},
    {$match: {tags: {$in: pip.activity.tags}}},
    {$group : {_id : '$_id',matches:{$sum:1}}},
    {$project: { _id: 0,matches:1,otherField:otherField}}, <-- include otherField
    {$sort: {matches:-1 }},
    callback
);

这可能吗,或者我应该在这个特定步骤中使用 forLoop 或 MapReduce 吗?我正在寻找真正有效的东西。

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    $project 管道运算符不允许您注入对象,但您可以在 $group 运算符中更早地插入对象 ID。如果您有收藏:

    db.foo.save({_id:1,tags:['a','b']})
    db.foo.save({_id:2,tags:['b','c']})
    db.foo.save({_id:3,tags:['c','d']})
    

    然后你可以写:

    db.foo.aggregate({
     $unwind: "$tags"},{ 
     $match: { tags: {$in: ['b','c'] } }},{
     $group: { _id: "$_id", matches: {$sum: 1 }, otherField: {$min: new ObjectId()} }},{
     $project: { _id: 0, matches: 1, otherField: 1 }},{
     $sort: { matches: -1 }})
    

    这里可以使用 $min 或 $max,但它需要一个运算符或对字段的引用,所以你必须给它一个..

    【讨论】:

    • 感谢 Nuk Nuk,我试了一下,它完成了这项工作 :) 希望在未来的版本中,有些东西似乎不是一种解决方法,但仍然比 MapReduce 更好!
    • 在 $project 中指定任意常量 BSON 值的能力似乎是一个很好的请求 - 如果它已经存在,可能值得添加一个 JIRA 或投票支持它。有一些关于 $literal 运算符的讨论 - 可能值得关注。
    猜你喜欢
    • 1970-01-01
    • 2016-07-03
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 2012-10-24
    • 2023-03-22
    相关资源
    最近更新 更多