我是MongoDB的新手,所以这可能是一个基本问题,但是我在处理方法上遇到了麻烦。
我想在我的收藏夹中找到一个文档,就像这样:
db.collection("articles").find({curid:"1000143"}).asArray();
返回的字段之一是包含其他文档的“ curid”(唯一值)的数组:
HDP_Topics = ["1124516", "101388", "1031462", "1053284", "1077080", "1150760", "1092377", "1100194", "1103692", "1135134", "1134909", "1119820", "1000634", "1120316", "1000143"]
我要做的是查找其他所有文档,并将它们附加到已经存在的查找查询结果中。我敢肯定,有一种方法不必对数组中的每个元素进行新搜索。
(如果有任何区别,我正在使用mongoDB Atlas的针迹)
答案 0 :(得分:1)
如果我正确理解了该问题,则要使用HDP_Topics字段触发新的搜索。您可以为此使用$graphLookup:
db.articles.aggregate( [
{
$graphLookup: {
from: "articles",
startWith: "1000143",
connectFromField: "HDP_Topics",
connectToField: "curid",
as: "otherDocs",
maxDepth: 2
}
}
] )
如果要获得更高的递归级别,请更改maxDepth
。此搜索会将生成的文档放在otherDocs
下。
答案 1 :(得分:0)
这不是很漂亮,但是我看不到其他选择。因此,这就是我最终为快速修复所做的事情。希望聚合功能(感谢@enys)将很快实现。
function getDataByTitle(title){
try{
var deferred = $q.defer();
var docs = db.collection("articles").find({title:title}).asArray().then(
docs => {
var newData = [[docs[0]]];
var docsLength = $rootScope.articlesToCompare;
for(let i=1, p = Promise.resolve(); i < docsLength; i++){
p = p.then(_ => new Promise(resolve => {
newData.push(db.collection("articles").find({curid:docs[0].cosineArray[i]}).asArray());
resolve();
if(i==docsLength-1) deferred.resolve(newData);
}));
}
}
);
return deferred.promise;
} catch(err) {
console.log(err);
}
}
注意:我从“ HDP_Topics”更改为“ cosineArray”。另外docsLength是预定义的,它只能用作$ limit替代,因为我正在使用多个查询,所以无法在查询本身中定义它。
结果是一组文章数组。您可以在此处unitroll.me上使用右上角的搜索栏查看它的运行情况。