这是我的目标:

{ "_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做了什么错事吗?有没有更好的方法来实现这一点?

推荐答案

好吧,你可以在find的投影块上使用"array.field".

 db.itens.find({},{"complist.b":1,list:{$elemMatch:{$in:["a"]}}})

做了我需要的.

Mongodb相关问答推荐

MongoDB 4.4如何使用未知密钥更新dict

在一个视图中连接两个集合MongoDB;展开有什么作用?

如何从集合中移除所有匹配的数组项?

如何判断 MongoDB 的两个数组中是否存在值?

如何将以下聚合查询转换为 bson 并在 golang 中执行

嵌套数组 $unwind 和 $group 在 mongoDB 中重新组合在一起

使用新字段插入数据或使用 updateOne mongodb 有条件地更新

使用绝对类型在 Typescript 中编写 Mongoose 的类型化模型和模式的类和接口

mongoose如何在幕后工作

MongoDB获取聚合查询的executionStats

什么 Javascript 库可以针对对象判断类似 MongoDB 的查询谓词?

删除嵌套文档数组中的嵌入文档

使用 mgo 存储嵌套 struct

MongoDB:在集合上设置 TTL 索引时出错: sessions

MongoDB $or 查询

带有排序功能的mongoose findOne

Golang + MongoDB 嵌入类型(将一个 struct 嵌入到另一个 struct 中)

Mongo Schema-less集合和 C#

在 MongoDB 上使用 $push 更新数组时避免重复值

Mongodb $lookup 使用 _id 无效果