MongoDB 关系查询

Raf*_*ael 5 mongodb node.js

我是 mongo 的新手,仍然试图将我的头从 mySQL 方法转移到 mongo,所以有些事情对于我应该如何做仍然很模糊,我希望你们能给我一些启发。

让我解释一下这个问题。我正在使用 NodeJS 和 mongodb 本机。

假设我有一个用户集合(我使用了更简单的 _id 只是为了说明,我知道它是一个 objectID,但只是为了示例而考虑)

{
     _id: 1,
     name: 'John',
     likes: ['2','3','4'] 
},
{
     _id: 2,
     name: 'Michelle'
     likes: ['1','4']
},
{
     name: 'Sabrina'
     _id: 3,
     likes: []
},
{
     name: 'Simone'
     _id: 4,
     likes: ['1','2', '3']
}
Run Code Online (Sandbox Code Playgroud)

请注意,约翰喜欢米歇尔、萨布丽娜和西蒙娜,米歇尔喜欢约翰和西蒙娜,萨布丽娜不喜欢任何人,西蒙娜喜欢约翰、米歇尔和萨布丽娜。

我如何对约翰运行查询,以根据他的一系列喜欢找出谁也喜欢他?我需要一些如果 id = 1 则返回 Michelle 的东西,或者如果 id = 4 则返回 John 和 Michelle 的东西。只有我要获取的 id 位于其他用户喜欢的内容中。

让我尝试简化一下。

我需要找 John 并查看他所有的点赞,并检查 id 2 也喜欢我吗?是的,id 3 也喜欢我吗?不

返回[约翰];

或者找来西蒙娜并查看她所有的点赞并检查 id 1 也喜欢我吗?是的,id 2 也喜欢我吗?是的,id 3 也喜欢我吗?不

返回[约翰,米歇尔]

任何帮助将不胜感激:) 谢谢

jsd*_*sdw 5

开始了:

像这样的事情应该可以在nodejs中使用mongodb-native驱动程序来实现:

var people = db.collection("users");
people.findOne({name: "John"}, function(err, result)
  if(err) throw err; //..or however you want to handle an error.
  people.find({_id: {$in: result.likes}, likes:result._id}).toArray(function(err, others)
    {
    if(err) throw err; //...again, your call how to handle a potential error.
    //finds all people who are in likes array AND have Johns ID in their likes array.
    });
  });
Run Code Online (Sandbox Code Playgroud)

基本上,首先您检索约翰的记录。接下来,您使用他的 Likes 数组来检索具有匹配 id 的所有用户:)

请注意,可以通过选择仅检索 John 的 Like 字段来对此进行稍微优化,如下所示:

people.findOne({name: "John"}, {"likes": 1}, function(err, result)
  {
  //.....
  });
Run Code Online (Sandbox Code Playgroud)

另请注意,如果 Likes 数组特别庞大,您可能希望一次检索一个值,而不是使用该.toArray()方法一次检索所有值,而是使用从 find() 返回的游标并一次处理一个项目,如下所示在:

//....
var cursor = people.find({_id: {$in: result.likes}, likes:result._id});
cursor.each(function(err, item)
    {
    if(err) throw err; //...
    if(item != null)
    //do stuff with each person returned given likes array
    });
//....
Run Code Online (Sandbox Code Playgroud)

恐怕我还没有测试过以上内容,所以如果我犯了任何错误,我深表歉意!

我发现 mongo-native node.js 驱动程序的手册非常宝贵;它很好地涵盖了大多数内容(尽管有些代码看起来比其他代码有点“旧”):

http://mongodb.github.io/node-mongodb-native/api-articles/nodekoarticle1.html