【发布时间】:2014-10-21 02:25:15
【问题描述】:
这是我的对象:
{ "_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”。这是要获取论坛的话题基本信息,我不想要所有的话题信息,只需要几件事。
但是当我尝试使用查询时
db.itens.aggregate({$project:{"complist.b":1,list:{$elemMatch:{$in:["a"]}}}})
尝试两者都做,它会抛出一个错误,说运算符 $elemMatch 无效。
我在这里对 $elemMatch 做错了吗?有没有更好的方法来实现这一点?
【问题讨论】:
标签: mongodb projection