我有一个mongo文档,如下所示,我希望能够进行两次搜索:
1)搜索id = 123 2)搜寻id = 1234的小马
所以我需要的文档可以是顶层文档或嵌套文档。
{
"id": "123",
"name" : "testName",
"docs": [
{
"id": "1234",
"name" : "testName4",
"docs": []
}
]
}
所以基本上我可能需要顶层文档或嵌套文档。我正在查看图形查找,但我认为这不会满足我的需要,我还查看了聚合-似乎它们可以工作?
答案 0 :(得分:2)
您能说明一下结果如何吗?
如果您要搜索ID为“ 123”的文档,或者要在ID为“ 1234”的“ docs”中包含文档,则只需查询以下内容:
db.teststack.find({$or: [{"id": "123"}, {"docs.id": "1234"}]})
,它将始终返回完成文档。
编辑
请参见我编写的以下示例:
db.teststack.mapReduce(
function(){
let scanfunction = (passobj) => {
if(passobj.id === "123") {
emit("id123", this._id);
}
else {
for(var key in passobj) {
if(typeof passobj[key] === "object"){
scanfunction(passobj[key]);
}
}
}
}
scanfunction(this);
}
,
function(key, stuff){
let ret = "";
for(let t1 in stuff)
ret += stuff[t1] + ";";
return ret;
}
,
{
"out": "keys"
}
).find()
它只是返回一个包含所有ObjectId的字符串
该代码具有可扩展性,因为它可以扫描数据库中所有文档的所有键,但因此性能不佳!