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

让我们通过使用上述架构来演示这一点。在selffriends两个集合中插入样本数据:

// 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 不会太有利,因为 _ids 以字符串形式存储在参考集合中。

以上是关于MongoDB查询在引用数据库时显示数组属性中的所有值的主要内容,如果未能解决你的问题,请参考以下文章

在运行时显示 SQL Server 查询结果中的数据类型和列大小

尝试将其作为对象中的属性传递时显示标记 URL 中断

在每次页面访问或页面重新加载时显示一个新的 GIF

JS文件中的中文在网页引用时显示乱码的简单解决方式

单击时显示数组中的最后一个索引(在继续更新的数组中)

如何在 UITableView 中显示数组中的 x 个对象,然后在向下滚动时显示更多?