我想帮助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 }
}
}
])
如何提出请求?
答案 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数据库设计。