使用" $和"和" $ in"一起

时间:2016-09-19 14:32:40

标签: mongodb

我有一个集合friends,我用来存储所有朋友,并有以下字段

  

id,userid,friendid

我有一个用于存储用户注释的集合notes,其中包含以下字段

  

id,userid,ownerid,privateorpublic

规则是用户只能看到他/她创建的笔记或他/她的朋友创建的笔记或公开笔记

要获取该信息,我会以这种方式编写查询。首先,用逗号分隔我朋友的所有id。我不知道如何编写查询以返回逗号分隔值,但下面的这个查询我希望将返回给定id的用户的所有内容:

db.friends.find({ { friendid: { userid: 'jhdshh37838gsjj' } }

然后获取由朋友创建的笔记或公共笔记或属于用户的笔记

db.notes.find({ownerid:'jhdshh37838gsjj', privateorpublic:'public',{ $in: [ "3ghd8e833", "78hhyaysgd" ] }

我是MongoDB的新手。我的查询是对的吗?

1 个答案:

答案 0 :(得分:1)

查找查询语法:db.collection.find({queryFieldName: queryFieldValue}, {requiredFieldName: 1, NotRequiredFieldName: 0})

因此,翻译第一个查询,您就可以从收集朋友那里获取所有文件,其中friendId等于字符串{'userId':'Id'}"这是不可取的。

查询"给我所有朋友的idid用户ID jhdshh37838gsjj并且不要在结果中打印任何其他内容" :db.collection.find({userId:'jhdshh37838gsjj'}, {friendId:1, _id:0})

但是,这并不以逗号分隔值的形式给出输出。您将获得如下输出(因为每个文档都是一个独立的对象):

{friendId: 1}
{friendId: 2}

$ in需要数组作为输入而不是逗号分隔值。要为$ in查询创建字段值数组,您需要执行一些额外的工作,如:

var friendIdsArr = [] //Initiate an array to store friend Ids
db.friends.find({'userId':'jhdshh37838gsjj'},{'friendId':1,'_id':0}).forEach(function(x) {friendIdsArr.push(x.friendId);} ); //Foreach result in query, push value  to array.

friendIdsArr将为[1,2]

db.notes.find({'ownerId':'jhdshh37838gsjj', 'privateOrPublic':'public',{$in: ["friendId": friendIdsArr]}) 将给出结果,json文档,匹配给定的条件。

有趣的是,您的notes集合没有note字段。

我建议您阅读mongodb official documentation并进行单个查询,而不是两个不同的查询。