gpt4 book ai didi

MongoDB - FindOne 和过滤嵌套数组

转载 作者:行者123 更新时间:2023-12-02 17:21:58 26 4
gpt4 key购买 nike

我正在从 SQL 迁移到 MonboDB,并且我正在尝试学习基础知识。但到目前为止,我一直在努力解决一个“Select 语句”

假设我有这样的收藏

文档1

{
"_id" : "id1",
"name" : "aa",
"array" : [
{
"nested_id" : "n323123",
"nesteddata" : "lorem",
"active" : 1
},
{
"nested_id" : "n353123",
"nesteddata" : "lorem",
"active" : 0
},
{
"nested_id" : "n323123",
"nesteddata" : "lorem",
"active" : 1
}
]
}

文档2

{
"_id" : "id2",
"name" : "bb",
"array" : [
{
"nested_id" : "n325123",
"nesteddata" : "lorem",
"active" : 1
},
{
"nested_id" : "n355123",
"nesteddata" : "lorem",
"active" : 1
},
{
"nested_id" : "n323123",
"nesteddata" : "lorem",
"active" : 0
}
]
}

然后我想选择一个且仅嵌套数据。已尝试使用以下语句,但没有成功。

db.testing.findOne(  {_id: "id1", "array.active" : 1} )

但我仍然在没有过滤器的情况下获取所有数据

最佳答案

首先,当你只想获取文档的一部分时,你需要使用双对象形式的 find:

db.testing.findOne(  
{ _id: "id1", "array.active" : 1 },
{ array: 1 }
);

第二个对象告诉您要返回文档的哪些字段。但是,即使只有一个匹配条目,此查询也将返回整个数组。但您只需要一个特定的数组条目。所以你必须使用positional-operator $在你的第二个对象中。 “$”是与第一个对象匹配的数组条目的占位符。

db.testing.findOne(  
{ _id: "id1", "array.active" : 1 },
{ "array.$": 1 }
);

仍然有一个限制,对于您的用例来说可能会出现问题,也可能不会出现问题:$ 运算符仅返回每个文档的每个数组的第一个条目。您正在使用 findOne 所以我假设您的目的是只获取一个数组条目。但这个限制将来可能会给你带来麻烦。

当你想获取所有数组条目时,你必须使用 aggregation pipeline共 3 个步骤。

  1. 使用 $match 过滤您需要结果的文档
  2. 使用 $unwind 将数组展开为单个文档流
  3. 通过适用于数组属性的条件再次过滤生成的文档流 $match
  4. (可选)使用 $project 将文档减少到仅您想要的字段

这个管道看起来像这样:

db.testing.aggregate([
{ $match: { _id: "id1" } },
{ $unwind: { array: 1 } },
{ $match: { "array.active": 1 } },
{ $project: { _id: 0, array: 1 }
]);


关于MongoDB - FindOne 和过滤嵌套数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28877404/

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