如何比较2个集合并在mongodb中获取匹配的字段数据?

时间:2018-08-17 04:13:46

标签: arrays json node.js mongodb

我有两个收藏夹,如下所示。

收藏1:列表

{
"_id" : ObjectId("5b618589d6edcc135c1aee0a"),
"name" : "ABC",
"special" : "Golmal",
"dim" : "2122",
}

集合2:数据

文档1:

{
"_id" : ObjectId("5b6023d9589ff6bfb5dd75d7"),
"date" : "2018/08/13",
"special" : "Golmal",
}

文档2:

{
"_id" : ObjectId("5b602447589ff6bfb5dd7606"),
"date" : "2018/08/13",
"special" : "Godman",
}

在这里我想比较集合,如果集合2文档中存在集合1的"special":"Golmal",我想显示/获取集合1文档中的所有相关日期。

我尝试了aggregate$lookup如下

getAvailableList(): Promise<any> {
    return this._mongoUtility.Db
        .then(db => {
            let list= db.collection('list');
            let data= db.collection('data');           
            list.aggregate([{$lookup:
                {
                    from: data,
                    localField: "special",
                    foreignField: "special",
                    as: "matches"
                }
            },
                {
                    $match: { "matches": { $ne: [{}] } }
                }
            ]);
            return Promise.resolve();
        })
        .catch(err => {
            return Promise.reject({message: 'Not found', err: err});
        });
}

但是我得到的是空值。

我还通过如下方式使用.findforEach

 let abc = [];
            list.find({}).toArray()
                .then(arr => {
                    arr.forEach(obj1 => {
                        data.find({special: obj1.special}).toArray()
                            .then(secondArr => {
                                console.log(secondArr);
                                if (secondArr.length > 0) {
                                    abc.push(obj1);
                                }
                            });
                    });
                });
            return Promise.resolve();

但是没有结果。我需要JSON格式的值。由于MongoDB没有加入。有什么办法破解它?

2 个答案:

答案 0 :(得分:1)

好吧,我通过不使用forEach及其对我有用的方式来更改了执行该查询的方式。

我在mongoDB网站的$in中遇到了find。这就是答案

    return new Promise((res, rej) => {
        this._mongoUtility.Db
            .then(db => {
                let list= db.collection('List');
                let data= db.collection('Data');

                data.find({}).toArray()
                    .then(arr => {
                        let maps = arr.map(data => data.special);
                        list.find({special: {$in: maps}}).toArray()
                            .then(secondArr => {
                                res(secondArr);
                            });
                    });
            })
            .catch(err => {
                return rej({message: 'Not found', err: err});
            });
    });

答案 1 :(得分:0)