我有一个由 id、名称和项目数组组成的文档组成的集合;每个文档中的数组在适用时应该嵌套相同结构的其他文档,并且文档的嵌套数组的数量没有限制(嵌套文档也可以有嵌套文档)。
使用 MongoClient 包,我尝试查询我的集合并根据其 id 返回文档,无论它在数据中的位置如何(无论是在顶层还是在下 3 层)。
到目前为止,我可以返回任何顶级数据,但我的查询没有找到任何嵌套数据。我见过类似的问题,其中数据结构是有限且一致的,但由于我的数据是动态的和多层的,我还没有找到适合这个特定问题的解决方案。
这是我的数据:
[
{
"_id": 1,
"name": "Test 1",
"items": []
},
{
"_id": 2,
"name": "Test 2",
"items": [
{
"_id": 3,
"name": "Test 3",
"items": []
},
{
"_id": 4,
"name": "Test 4",
"items": [
{
"_id": 6,
"name": "Test 6",
"items": []
}
]
}
]
},
{
"_id": 5,
"name": "Test 5",
"items": []
}
]
Run Code Online (Sandbox Code Playgroud)
这是我的 Mongo 查询:
MongoClient.connect(connString, function(err, db) {
var collection = db.collection('items');
collection.findOne({_id: ObjectID("4")}, function(err, result) {
console.log(result);
});
db.close();
});
Run Code Online (Sandbox Code Playgroud)
结果旨在返回以下内容,但返回 null:
{
"_id": 4,
"name": "Test 4",
"items": [
{
"_id": 6,
"name": "Test 6",
"items": []
}
]
}
Run Code Online (Sandbox Code Playgroud)
谁能分享一个关于如何按预期检索数据的解决方案?
由于每个级别的属性发生变化,不可能查询无限量的文档。有关可以使用的选择器列表,请参阅查询选择器 ( https://docs.mongodb.com/manual/reference/operator/query/#query-selectors )。
但是,如果可以限制或给出项目的深度限制,那么您可以使用如下查询:-
db.col.find( {$or: [ { "_id" : id }, { "items._id" : id }, { "items.items._id" : id }, { "items.items.items._id" : id } ] } );
Run Code Online (Sandbox Code Playgroud)
如果无法给出深度限制,我建议将文档重新建模为:
[
{
"_id": 1,
"name": "Test 1"
},
{
"_id": 3,
"name": "Test 3",
"parentId": 2
},
{
"_id": 6,
"name": "Test 6",
"parentId": 4
},
{
"_id": 4,
"name": "Test 4",
"parentId": 2
},
{
"_id": 2,
"name": "Test 2",
},
{
"_id": 5,
"name": "Test 5",
}
]
Run Code Online (Sandbox Code Playgroud)
然后你可以通过 _id 查询进行简单的查找:
> db.collection.find({_id: 4})
{ "_id" : 4, "name" : "Test 4", "parentId" : 2 }
Run Code Online (Sandbox Code Playgroud)
如果您还需要保留查询的文档结构,则可以使用$graphLookup聚合阶段。
| 归档时间: |
|
| 查看次数: |
1633 次 |
| 最近记录: |