Javascript MongoDB检索另一个文档中包含的每个文档';s数组
我是MongoDB的新手,所以这可能是一个基本问题,但我在如何解决这个问题上遇到了困难 我想在我的收藏中找到一个文档,如下所示:Javascript MongoDB检索另一个文档中包含的每个文档';s数组,javascript,mongodb,mongodb-stitch,Javascript,Mongodb,Mongodb Stitch,我是MongoDB的新手,所以这可能是一个基本问题,但我在如何解决这个问题上遇到了困难 我想在我的收藏中找到一个文档,如下所示: db.collection("articles").find({curid:"1000143"}).asArray(); 返回的字段之一是包含其他文档的“curid”(唯一值)的数组: 我要做的是找到其他每个文档,并将它们附加到已经存在的find查询结果中。我确信一定有一种方法不必对数组中的每个元素进行新的搜索 (如果有什么不同,我正在使用mongoDB Atlas
db.collection("articles").find({curid:"1000143"}).asArray();
返回的字段之一是包含其他文档的“curid”(唯一值)的数组:
我要做的是找到其他每个文档,并将它们附加到已经存在的find查询结果中。我确信一定有一种方法不必对数组中的每个元素进行新的搜索
(如果有什么不同,我正在使用mongoDB Atlas的Stitch)如果我正确理解了这个问题,您希望使用HDP_主题字段触发新的搜索。为此,您可以使用一个:
db.articles.aggregate( [
{
$graphLookup: {
from: "articles",
startWith: "1000143",
connectFromField: "HDP_Topics",
connectToField: "curid",
as: "otherDocs",
maxDepth: 2
}
}
] )
如果希望有更多的递归级别,请更改
maxDepth
。此搜索将把结果文档放在其他文档下
这并不漂亮,但我看不到任何其他选择。所以这就是我最后为快速修复所做的。希望聚合功能(谢谢@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);
}
}
函数getDataByTitle(标题){
试一试{
var deferred=$q.deferred();
var docs=db.collection(“articles”).find({title:title}).asArray()。然后(
文档=>{
var newData=[[docs[0]];
var docsLength=$rootScope.articlesToCompare;
for(设i=1,p=Promise.resolve();i结果是一个项目数组。使用右上角的搜索栏,您可以在此处看到它的实际操作。这不起作用,因为您试图将HDP_主题用作“路径”(您告诉mongo使用当前文档的HDP_Topics属性,但这里不是这样。HDP_Topics将被视为变量,但该变量未定义,因此这将出错或不起作用(不确定是哪个)谢谢@ParthThakkar的更正,我更新了我的答案。谢谢你的回复,但是Stitch还不支持$graphLookup…这让事情变得…有趣。是的,我没有看到,抱歉。然后你就可以用递归函数来包装它了。这也给了你更多的控制权,如果这有什么安慰的话。
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);
}
}