这是我的物品:
{ "_id" : ObjectId("53fdcb6796cb9b9aa86f05b9"), "list" : [ "a", "b" ], "complist" : [ { "a" : "a", "b" : "b" }, { "a" : "c", "b" : "d" } ] }
这是我想实现的目标:检查“list”是否包含特定元素,并在阅读文档时仅获取“complist”中对象的字段“a”,而不考虑任何这些值。我正在构建一个论坛系统,这是将返回论坛详细信息的查询。我需要在了解用户是否在论坛的白名单中的情况下读取论坛信息。使用find函数,我可以使用以下查询:
db.itens.find({},{list:{$elemMatch:{$in:["a"]}}})
为了仅获取匹配特定值的第一个元素,这样我就可以检查返回的数组是否不为空,并且知道“list”是否包含我要查找的值。我不能在查询上执行此操作,因为我希望无论“list”值中是否包含我要查找的值,都能获取文档。我需要文档并知道“list”是否具有特定值。
使用聚合,我可以使用查询
db.itens.aggregate({$project:{"complist.a":1}})
我希望只读取complist中包含的对象的字段“a”。这将获取论坛主题的基本信息,我不需要所有主题的信息,只需要其中的一些。
但是当我尝试使用查询时
db.itens.aggregate({$project:{"complist.b":1,list:{$elemMatch:{$in:["a"]}}}})
尝试同时执行这两个操作,它会抛出一个错误,指示运算符$elemMatch无效。
我在聚合中是否有什么地方使用$elemMatch时出错了?有更好的方法来完成这个任务吗?
Invalid $project :: caused by :: FieldPath field names may not start with '$'.
- Pixsa