我是 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 也喜欢我吗?不
返回[约翰,米歇尔]
任何帮助将不胜感激:) 谢谢
开始了:
像这样的事情应该可以在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
| 归档时间: |
|
| 查看次数: |
9151 次 |
| 最近记录: |