gpt4 book ai didi

mongodb - 使用 $elemMatch 时如何检索所有字段?

转载 作者:可可西里 更新时间:2023-11-01 09:44:43 26 4
gpt4 key购买 nike

考虑以下帖子集合:

{
_id: 1,
title: "Title1",
category: "Category1",
comments: [
{
title: "CommentTitle1",
likes: 3
},
{
title: "CommentTitle2",
likes: 4
}

]
}
{
_id: 2,
title: "Title2",
category: "Category2",
comments: [
{
title: "CommentTitle3",
likes: 1
},
{
title: "CommentTitle4",
likes: 4
}

]

}
{
_id: 3,
title: "Title3",
category: "Category2",
comments: [
{
title: "CommentTitle5",
likes: 1
},
{
title: "CommentTitle6",
likes: 3
}
]
}

我想检索所有帖子,如果一个帖子有一条评论有 4 个赞,我只想在“评论”数组下检索这条评论。如果我这样做:

db.posts.find({}, {comments: { $elemMatch: {likes: 4}}})

...我明白了(这正是我想要的):

{
_id: 1,
comments: [
{
title: "CommentTitle2",
likes: 4
}
]
}
{
_id: 2,
comments: [
{
title: "CommentTitle4",
likes: 4
}
]
}
{
_id: 3
}

但是我怎样才能检索文档的剩余字段而不必像下面那样声明它们中的每一个?这样,如果向 post 文档添加更多字段,我就不必更改查找查询

db.posts.find({}, {title: 1, category: 1, comments: { $elemMatch: {likes: 4}}})

谢谢

最佳答案

--编辑--

很抱歉误读了您的问题。我想你会发现我在这里对这个问题的回答正是你要找的。正如人们评论的那样,您不能在查找中以这种方式投影,但您可以使用聚合来实现:

https://stackoverflow.com/a/21687032/2313887

答案的其余部分是有用的。所以我想我会把它留在这里

在使用投影时,您必须指定所有您想要的字段或什么都不指定。

您在这里实质上是在问,一旦您选择更改文档的输出并限制一个字段的显示方式,那么我是否可以避免指定行为。底线是考虑查询参数的投影部分,就像 SQL SELECT 一样。它的行为是 * 或 all 是默认值,之后是列表字段和字段格式的一些操作。唯一的区别是 _id 默认情况下始终存在,除非通过排除它另行指定,即 { _id: 0 }

或者,如果您想过滤您需要放置 $elemMatch 的集合在query本身。 projection这里的用法是明确限制返回的文档只包含数组中匹配的元素。

改变你的查询:

db.posts.find(
{ comments: { $elemMatch: {likes: 4}}},
{ title: 1, category: 1, "comments.likes.$": 1 }
)

为了得到你想要的,我们使用位置 $运算符在查找的投影部分。

两种用法的区别见文档:

http://docs.mongodb.org/manual/reference/operator/query/elemMatch/

http://docs.mongodb.org/manual/reference/operator/projection/elemMatch/

关于mongodb - 使用 $elemMatch 时如何检索所有字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21588365/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com