gpt4 book ai didi

arrays - MongoDb - 在嵌套数组中查找特定对象

转载 作者:行者123 更新时间:2023-12-05 08:57:22 27 4
gpt4 key购买 nike

我希望有人能阐明我遇到的这个问题,这让我发疯了,过去三天我一直在学习越来越多关于 mongoDB 的知识,但仍然无法弄清楚这个简单的查询.

我需要做的是获取包含“carId”=“3C”的对象。

换句话说,我希望查询返回的对象是:

            {
"carId" : "3C",
"_id" : ObjectId("51273329b64f07a40ef1c15e")
}

这是数据集(汽车):

   { 
"_id" : ObjectId("56223329b64f07a40ef1c15c"),
"username" : "john",
"email" : "john@john.com",
"accounts" : [
{
"_id" : ObjectId("56322329b61f07a40ef1c15d"),
"cars" : [
{
"carId" : "6A",
"_id" : ObjectId("56323329b64f07a40ef1c15e")
},
{
"carId" : "6B",
"_id" : ObjectId("56323329b64f07a40ef1c15e")
}
]
}
]
},
{
"_id" : ObjectId("56223125b64f07a40ef1c15c"),
"username" : "paul",
"email" : "paul@paul.com",
"accounts" : [
{
"_id" : ObjectId("5154729b61f07a40ef1c15d"),
"cars" : [
{
"carId" : "5B",
"_id" : ObjectId("56323329854f07a40ef1c15e")
}
]
},
{
"_id" : ObjectId("56322117b61f07a40ef1c15d"),
"cars" : [
{
"carId" : "6G",
"_id" : ObjectId("51212929b64f07a40ef1c15e")
},
{
"carId" : "3C",
"_id" : ObjectId("51273329b64f07a40ef1c15e")
},
{
"carId" : "4N",
"_id" : ObjectId("51241279b64f07a40ef1c15e")
}
]
}
]
}

请注意,我有两个嵌套数组,显然 MongoDb 在处理深度数组的投影时​​缺乏。 $ 运算符只能在投影中使用一次;对于如何完成这个简单的任务,一无所知。

所以我想再次找到——仅——具有“carId”:“3C”的文档,并且只返回包含“carId”:“3C”的直接对象。但不是父对象。

如有任何帮助,我们将不胜感激。可能使用直接 MongoDb 或 Mongoose。首选 Mongoose。

作为引用,我已经涵盖了这些其他相关问题无法弄清楚。

Updating a deep record in MongoDb

How to Update Multiple Array Elements in mongodb

希望在未来,这个问题和您的解决方案能帮助到其他人。

最佳答案

阿米尔,

您必须使用 Aggregation Framework .您可以构建一个管道,通过几个构建 block 来处理流文档:过滤、投影、分组、排序等。

处理嵌套数组时,您必须使用$unwind 命令。您可以通过执行以下操作获得您想要的。

db.cars.aggregate(
//De-normalized the nested array of accounts
{"$unwind": "$accounts"},
//De-normalized the nested array of cars
{"$unwind": "$accounts.cars"},
//match carId to 3C
{"$match": {"accounts.cars.carId" : "3C"}},
//Project the accoutns.cars object only
{"$project" : {"accounts.cars" : 1}},
//Group and return only the car object
{"$group":{"_id":"$accounts.cars"}}
).pretty();

您可以通过使用 $unwind 来使用聚合框架进行“数组过滤” .

您可以删除上述代码中聚合管道中每个命令底部的每一行,以观察管道行为。

关于arrays - MongoDb - 在嵌套数组中查找特定对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33422770/

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