这是我的目标:
{ "_id" : ObjectId("53fdcb6796cb9b9aa86f05b9"), "list" : [ "a", "b" ], "complist" : [ { "a" : "a", "b" : "b" }, { "a" : "c", "b" : "d" } ] }
这就是我想要完成的:判断"list"是否包含某个元素,并在读取文档时仅从"complist"上的对象中获取字段"a",而不考虑这些值中的任何一个.我正在建立一个论坛系统,这个查询将返回论坛的详细信息.我需要阅读论坛信息,同时知道用户是否在论坛的白名单中.
通过查找,我可以使用查询
db.itens.find({},{list:{$elemMatch:{$in:["a"]}}})
只获取与某个值匹配的第一个元素.这样我就可以判断返回的数组是否为空,并且我知道"list"是否包含我要查找的值.我无法在查询中执行此操作,因为我需要文档,无论它是否包含我在"列表"值中查找的值.我需要这份文件,知道"列表"是否有一定的价值.
通过聚合,我可以使用查询
db.itens.aggregate({$project:{"complist.a":1}})
仅读取complist中包含的对象的字段"a".这将获得论坛的线程基本信息,我不想要所有线程的信息,只是几件事.
但是当我try 使用这个查询时
db.itens.aggregate({$project:{"complist.b":1,list:{$elemMatch:{$in:["a"]}}}})
要同时try 这两种方法,它会提示我一个错误,即运算符$elemMatch无效.
我在这里用$elemMatch做了什么错事吗?有没有更好的方法来实现这一点?