Sar*_*maz 64 collections join mongodb
users
{
"_id":"12345",
"admin":1
},
{
"_id":"123456789",
"admin":0
}
posts
{
"content":"Some content",
"owner_id":"12345",
"via":"facebook"
},
{
"content":"Some other content",
"owner_id":"123456789",
"via":"facebook"
}
Run Code Online (Sandbox Code Playgroud)
这是我的mongodb的样本.我想获得所有帖子的"via"属性等于"facebook"并由admin发布("admin":1).我无法弄清楚如何获取此查询.由于mongodb不是关系数据库,我无法进行连接操作.可能是什么解决方案?
Ani*_*wal 18
这是你的问题的答案.
db.getCollection('users').aggregate([
{$match : {admin : 1}},
{$lookup: {from: "posts",localField: "_id",foreignField: "owner_id",as: "posts"}},
{$project : {
posts : { $filter : {input : "$posts" , as : "post", cond : { $eq : ['$$post.via' , 'facebook'] } } },
admin : 1
}}
])
Run Code Online (Sandbox Code Playgroud)
或者你可以选择mongodb组.
db.getCollection('users').aggregate([
{$match : {admin : 1}},
{$lookup: {from: "posts",localField: "_id",foreignField: "owner_id",as: "posts"}},
{$unwind : "$posts"},
{$match : {"posts.via":"facebook"}},
{ $group : {
_id : "$_id",
posts : {$push : "$posts"}
}}
])
Run Code Online (Sandbox Code Playgroud)
Shu*_*rma 17
您可以使用$lookup
(multiple)从多个集合中获取记录:
例:
如果你有更多的集合(我在这里有3个集合用于演示,你可以拥有3个以上).我想从单个对象中获取3个集合中的数据:
该系列如下:
db.doc1.find()相当();
{
"_id" : ObjectId("5901a4c63541b7d5d3293766"),
"firstName" : "shubham",
"lastName" : "verma"
}
Run Code Online (Sandbox Code Playgroud)
db.doc2.find()相当();
{
"_id" : ObjectId("5901a5f83541b7d5d3293768"),
"userId" : ObjectId("5901a4c63541b7d5d3293766"),
"address" : "Gurgaon",
"mob" : "9876543211"
}
Run Code Online (Sandbox Code Playgroud)
db.doc3.find()相当();
{
"_id" : ObjectId("5901b0f6d318b072ceea44fb"),
"userId" : ObjectId("5901a4c63541b7d5d3293766"),
"fbURLs" : "http://www.facebook.com",
"twitterURLs" : "http://www.twitter.com"
}
Run Code Online (Sandbox Code Playgroud)
现在您的查询如下:
db.doc1.aggregate([
{ $match: { _id: ObjectId("5901a4c63541b7d5d3293766") } },
{
$lookup:
{
from: "doc2",
localField: "_id",
foreignField: "userId",
as: "address"
}
},
{
$unwind: "$address"
},
{
$project: {
__v: 0,
"address.__v": 0,
"address._id": 0,
"address.userId": 0,
"address.mob": 0
}
},
{
$lookup:
{
from: "doc3",
localField: "_id",
foreignField: "userId",
as: "social"
}
},
{
$unwind: "$social"
},
{
$project: {
__v: 0,
"social.__v": 0,
"social._id": 0,
"social.userId": 0
}
}
]).pretty();
Run Code Online (Sandbox Code Playgroud)
那你的结果将是:
{
"_id" : ObjectId("5901a4c63541b7d5d3293766"),
"firstName" : "shubham",
"lastName" : "verma",
"address" : {
"address" : "Gurgaon"
},
"social" : {
"fbURLs" : "http://www.facebook.com",
"twitterURLs" : "http://www.twitter.com"
}
}
Run Code Online (Sandbox Code Playgroud)
如果您想要每个集合中的所有记录,那么您应该从查询中删除以下行:
{
$project: {
__v: 0,
"address.__v": 0,
"address._id": 0,
"address.userId": 0,
"address.mob": 0
}
}
{
$project: {
"social.__v": 0,
"social._id": 0,
"social.userId": 0
}
}
Run Code Online (Sandbox Code Playgroud)
删除上述代码后,您将获得以下总记录:
{
"_id" : ObjectId("5901a4c63541b7d5d3293766"),
"firstName" : "shubham",
"lastName" : "verma",
"address" : {
"_id" : ObjectId("5901a5f83541b7d5d3293768"),
"userId" : ObjectId("5901a4c63541b7d5d3293766"),
"address" : "Gurgaon",
"mob" : "9876543211"
},
"social" : {
"_id" : ObjectId("5901b0f6d318b072ceea44fb"),
"userId" : ObjectId("5901a4c63541b7d5d3293766"),
"fbURLs" : "http://www.facebook.com",
"twitterURLs" : "http://www.twitter.com"
}
}
Run Code Online (Sandbox Code Playgroud)
小智 9
如前面在MongoDB中提到的,您无法在集合之间加入.
对于您的示例,解决方案可以是:
var myCursor = db.users.find({admin:1});
var user_id = myCursor.hasNext() ? myCursor.next() : null;
db.posts.find({owner_id : user_id._id});
Run Code Online (Sandbox Code Playgroud)
请参阅参考手册 - 光标部分:http://es.docs.mongodb.org/manual/core/cursors/
其他解决方案是将用户嵌入到帖子集合中,但我认为对于大多数Web应用程序,出于安全原因,用户集合需要独立.用户集合可能包含角色,权限等.
posts
{
"content":"Some content",
"user":{"_id":"12345", "admin":1},
"via":"facebook"
},
{
"content":"Some other content",
"user":{"_id":"123456789", "admin":0},
"via":"facebook"
}
Run Code Online (Sandbox Code Playgroud)
然后:
db.posts.find({user.admin: 1 });
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
122257 次 |
最近记录: |