gpt4 book ai didi

mongodb - 为什么 MongoDB $elemMatch 返回数组中的所有元素?

转载 作者:行者123 更新时间:2023-12-04 01:59:36 25 4
gpt4 key购买 nike

在 mongoDB (2.4) 中,我有一个集合 students,里面有一堆文档。每个文档的结构如下:

{
"_id" : ObjectId("55f16640a17eed480bb0dc18"),
"messages" : [
{
"_id" : ObjectId("55fc60bc260c9be5879ef733"),
"createdOn" : ISODate("2015-09-18T19:06:36.793Z"),
"fromUser" : ObjectId("55f16a6af9c703280c5b2c0e"),
"toUser" : ObjectId("55f16640a17eed480bb0dc18"),
"type" : 1
},
{
"_id" : ObjectId("55fc6d200d6097e98b210bff"),
"createdOn" : ISODate("2015-09-18T19:59:28.439Z"),
"fromUser" : ObjectId("55f721d1e1242e7c4c129471"),
"toUser" : ObjectId("55f16640a17eed480bb0dc18"),
"type" : 1
}
]
}

现在,我需要从 messages 数组中提取一个子文档,比如 messages._id 等于 55fc60bc260c9be5879ef733 所以我使用 $elemMatch:

db.users.find({"_id": new ObjectId('55f16640a17eed480bb0dc18'),
"messages": {
$elemMatch:{
"_id": new ObjectId('55fc60bc260c9be5879ef733'),
"fromUser": new ObjectId('55f16a6af9c703280c5b2c0e'),
"toUser": new ObjectId('55f16640a17eed480bb0dc18'),
"type": 1

}}}).pretty();

但这给了我:

{
"_id" : ObjectId("55f16640a17eed480bb0dc18"),
"messages" : [
{
"_id" : ObjectId("55fc60bc260c9be5879ef733"),
"createdOn" : ISODate("2015-09-18T19:06:36.793Z"),
"fromUser" : ObjectId("55f16a6af9c703280c5b2c0e"),
"toUser" : ObjectId("55f16640a17eed480bb0dc18"),
"type" : 1
},
{
"_id" : ObjectId("55fc6d200d6097e98b210bff"),
"createdOn" : ISODate("2015-09-18T19:59:28.439Z"),
"fromUser" : ObjectId("55f721d1e1242e7c4c129471"),
"toUser" : ObjectId("55f16640a17eed480bb0dc18"),
"type" : 1
}
]
}

如果我正确理解文档 http://docs.mongodb.org/v2.4/reference/operator/projection/elemMatch/我应该只收到:

{
"_id" : ObjectId("55f16640a17eed480bb0dc18"),
"messages" : [
{
"_id" : ObjectId("55fc60bc260c9be5879ef733"),
"createdOn" : ISODate("2015-09-18T19:06:36.793Z"),
"fromUser" : ObjectId("55f16a6af9c703280c5b2c0e"),
"toUser" : ObjectId("55f16640a17eed480bb0dc18"),
"type" : 1
}
]
}

那我做错了什么?

最佳答案

您没有使用投影运算符 $elemMatch 匹配,而是使用 query 运算符 $elemMatch

换句话说,您不投影任何东西,而是使用 $elemMatch 来过滤您的查询应返回的结果。

为了使您的投影正常工作,您应该将查询更改为:

db.users.find(
{"_id": new ObjectId('55f16640a17eed480bb0dc18')},
{"messages": {$elemMatch:{"_id": new ObjectId('55fc60bc260c9be5879ef733')}}}
).pretty();

上面的查询应该返回 _id 字段(与查询子句中出现的相同),以及 projection 子句中提到其 id 的数组元素

关于mongodb - 为什么 MongoDB $elemMatch 返回数组中的所有元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32672656/

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