【发布时间】:2021-10-27 04:26:42
【问题描述】:
假设我有一个这样的文档:
{
_id: ObjectId("1234567890"),
author: "ABC1",
text:"this is a Post",
details: {
time: "14/05/2015",
Edit: "none"
},
comments: [
{
comment_text: "Hello",
user: "alan",
time:"20/05/2014 20:44"
},
{
comment_text: "Hi Every One",
user: "bob",
time:"20/05/2014 20:44"
},
{
comment_text: "Good morning , Alan",
user: "Alan",
time:"20/05/2014 20:44"
},
{
comment_text: "I'm bob",
user: "bob",
time:"20/05/2014 20:44"
},
],
category: "IT"
}
我想构建一个返回此对象的查询,但 cmets 数组中只有 Bob 的 cmets。
{
author: "ABC1",
text:"this is a Post",
details: {
time: "14/05/2015",
Edit: "none"
},
comments: [
{
comment_text: "Hi Every One",
user: "bob",
time:"20/05/2014 20:44"
},
{
comment_text: "I'm bob",
user: "bob",
time:"20/05/2014 20:44"
},
],
category: "IT"
}
如何做到这一点?
- 在聚合管道中使用
$unwind(和$match)可以获得正确的子文档,但不能作为原始文档中的对象数组。 - 在投影中使用
$elemMatch(使用find()或findOne())只会返回第一个匹配的评论(子文档)。
【问题讨论】:
-
如果您想保留 bob cmets,以及除
_id之外的所有字段,您也可以像 this 一样做到这一点,就像 Montgomery Watts 一样,$filter的解决方案