MongoDB查询在引用数据库时显示数组属性中的所有值
Posted
技术标签:
【中文标题】MongoDB查询在引用数据库时显示数组属性中的所有值【英文标题】:MongoDB query show all value in array property when reference database 【发布时间】:2015-07-15 22:18:18 【问题描述】:如果某些值在 mongo 文档的数组属性中,我无法全部显示。比如我有一些收藏用户,和这样的文档:
这是收藏朋友
'list': [
'_id': '123',
'name':'Charlie',
'age':50,
,
'_id': '234',
'name':'Micheal',
'age':32,
,
'_id': '345',
'name':'Alice',
'age':45,
]
这是收藏品
'name':'Paul',
'age':43,
'friends':
[
'$ref': 'friend',
'$id': 123,
'$ref': 'friend',
'$id': 234,
'$ref': 'friend',
'$id': 345
],
现在,假设我想查询“显示保罗的所有朋友”,例如:
'name':'Paul',
'age':43,
'friendsIDs':
'friends':
[
'_id': '123',
'name':'Charlie',
'age':50 ,
'_id': '234',
'name':'Micheal',
'age':32,
'_id': '345',
'name':'Alice',
'age':45
]
【问题讨论】:
这需要在你的应用层完成,MongoDB不支持join。 【参考方案1】:MongoDB 不支持连接。您可以阅读更多关于 here 的信息。
但是,您可以在 MongoDB 中手动重现上述相同的场景,方法是使用一些原生 javascript 函数来使用引用填充 Friends 数组,并将修改后的数据保存到另一个集合中,例如 self_friends
。
让我们通过使用上述架构来演示这一点。在self
和friends
两个集合中插入样本数据:
// Populate self collection
db.self.insert([
'name':'Paul',
'age':43,
'friends':
[
'$ref': 'friend',
'$id': 123,
'$ref': 'friend',
'$id': 234,
'$ref': 'friend',
'$id': 345
]
]);
// Populate friends collection
db.friends.insert([
'_id': '123',
'name':'Charlie',
'age':50,
,
'_id': '234',
'name':'Micheal',
'age':32,
,
'_id': '345',
'name':'Alice',
'age':45,
]);
以下操作将使用所需结果填充另一个集合self_friends
:
db.self.find("name" : "Paul").forEach(function(doc)
var friends = doc.friends.map(function(f)
//var friend = db.friends.findOne(_id: f["$id"].toString())
// Or use @SylvainLeroux's brilliant suggestion
var friend = db.getCollection(f["$ref"]).findOne(_id: f["$id"].toString())
return friend;
);
doc.friends = friends;
db.self_friends.save(doc);
)
使用db.self_friends.find()
查询db.self_friends
集合将得到结果:
/* 0 */
"_id" : ObjectId("5549f2ff180e849972939047"),
"name" : "Paul",
"age" : 43,
"friends" : [
"_id" : "123",
"name" : "Charlie",
"age" : 50
,
"_id" : "234",
"name" : "Micheal",
"age" : 32
,
"_id" : "345",
"name" : "Alice",
"age" : 45
]
【讨论】:
鉴于 OP 文档存储 DBRef,也许您应该使用db.getCollection(f["$ref"]).findOne(_id: f["$id"].toString())
之类的东西——话虽如此,我认为在这里使用 DBRef 没有任何好处而不是普通的 id。还是这样?
@SylvainLeroux 实际上这是一个很好的建议,使用$ref
键来获取具有值的集合会更有意义。我也同意在上述情况下使用 DBRefs 不会太有利,因为 _id
s 以字符串形式存储在参考集合中。以上是关于MongoDB查询在引用数据库时显示数组属性中的所有值的主要内容,如果未能解决你的问题,请参考以下文章