MongoDb聚合框架,加入不同的文件都在同一个集合中

时间:2015-05-11 13:16:48

标签: mongodb mongodb-query aggregation-framework

我想帮助mongodb获取几个文档中的一个。 我有以下数据结构:

db.coll.insert([
 {_id: "gomer", doc_type: "user", group: ["user", "author"] },
 {_id: "dante", doc_type: "user", group: ["user"] },
 {_id: 1, doc_type: "blogs", user: "gomer", article: "aaaa" },
 {_id: 2, doc_type: "blogs", user: "vasya", article: "bbbb" }
])

我希望得到联合文件的要求:

{ _id:"123",
   blogs: {id:1, doc_type: "blogs", user: "gomer", article: "aaaa"},
   user : {id:"gomer", doc_type: "user", group: ["user", "author"]}
 }

但我无法写出有效的请求:

db.coll.aggregate([
  { $match:   {$or:[{doc_type:"blogs"},{doc_type:"user"}]} },
  { $project: {
      blogs: { id:$id, doc_type:"blogs", user:$user, article:$article },
      user:  { id:$id, doc_type:"user",  group:$group  }
        }
    }
])

如何提出请求?

2 个答案:

答案 0 :(得分:1)

我通过一个查询加入了多个文档。 谢谢大家,我得到了我的问题的答案。

db.test.aggregate([
    { $match:  { $or: [ {doc_type: "blogs"}, {doc_type: "user"} ] } },
    { $project: { 
            a: 1,
            blogs: {
                $cond: {
                    if: { doc_type: '$blogs'},
                    then: {_id:"$_id", user:"$user", article:"$article"},
                    else: null
                }
            },
            user: {
                $cond: {
                    if: { doc_type: '$user' },
                    then: { _id:"$_id", group:"$group"},
                    else: null
                }
            }
        }
    },
    { $group : {
               _id : { a: "$a" },
               user: { $push: "$user" },
               blog: { $push: "$blogs" },
            }
    },
    { $unwind : "$blog" },
    { $unwind : "$user" },
    { $project:{ 
        user: "$user",
        article: "$blog",
        matches: { $eq:[ "$user._id", "$blog.user" ] } }
    }, 
    { $match: { matches: true } }
])

答案 1 :(得分:0)

由于MonogoDB不支持Joins。您无法通过查询获得所需的输出。

如果您在使用MongoDB时需要实现“自联接”,那么您可能错误地(或次优地)构建了架构。在MongoDB(以及一般的noSQL)中,模式结构应该反映您需要针对它们运行的​​查询。

在您的具体情况下,我认为您需要稍微重新设计您的架构或在客户端上执行此操作。

{_id: "gomer", doc_type: "user", group: ["user", "author"], article:["aaaa"]},

您可以在用户文档中嵌入article。 (如果您认为文档的总大小不会超过16 Mb)。

请查看此answer数据库设计。