Node.js 展开组中的两个嵌套数组mongodb NodeJ

Node.js 展开组中的两个嵌套数组mongodb NodeJ,node.js,mongodb,mongodb-query,aggregation-framework,Node.js,Mongodb,Mongodb Query,Aggregation Framework,在NodeJS,MongoDb查询中,两种$unwind方法是否可以接受?我试图得到两个文档中所有不同的子文档 我的问题是: col.aggregate([ {$match: {name: 'Facebook'}}, {$unwind: "$products"}, {$unwind: "$offices"}, {$group:{ "_id": { CompanyName: "$name", Ho

NodeJS
MongoDb
查询中,两种
$unwind
方法是否可以接受?我试图得到两个文档中所有不同的子文档

我的问题是:

col.aggregate([
    {$match: {name: 'Facebook'}},

    {$unwind: "$products"},
    {$unwind: "$offices"},

    {$group:{
        "_id":  {
            CompanyName: "$name",
            HomepageURL: "$homepage_url",
            Description: "$description",
            NumberofEmployees: "$number_of_employees",
            TotalMoneyRaised: "$total_money_raised",
            FoundedYear: "$founded_year",
            CompanyCategory:{ $cond: { if: { $gte: [ "$number_of_employees", 10000 ] }, then: "BIG COMPANY", else: "SMALL COMPANY" }}    
                },
            Products: {$push: '$products.name'},             
            Offices: {$push: '$offices.description'}    
            }   
    },

    {$sort:{name: 1}}

]).toArray(function(err, docs) {
    console.log(docs);
    client.close();
});
});
我尝试展开两个嵌套数组,但查询输出重复的值。 以下是
产品
办公室
的结果:

Products:
 [ 'Facebook Platform',
   'Facebook Platform',
   'Facebook Platform',
   'Facebook News Feed',
   'Facebook News Feed',
   'Facebook News Feed',
   'Facebook Chat',
   'Facebook Chat',
   'Facebook Chat',
   'Facebook Connect',
   'Facebook Connect',
   'Facebook Connect',
   'Facebook Mobile',
   'Facebook Mobile',
   'Facebook Mobile',
   'Facebook',
   'Facebook',
   'Facebook',
   'Facebook Lite',
   'Facebook Lite',
   'Facebook Lite',
   'Facebook Places',
   'Facebook Places',
   'Facebook Places' ],
Offices:
 [ 'Headquarters',
   'Europe HQ',
   'New York',
   'Headquarters',
   'Europe HQ',
   'New York',
   'Headquarters',
   'Europe HQ',
   'New York',
   'Headquarters',
   'Europe HQ',
   'New York',
   'Headquarters',
   'Europe HQ',
   'New York',
   'Headquarters',
   'Europe HQ',
   'New York',
   'Headquarters',
   'Europe HQ',
   'New York',
   'Headquarters',
   'Europe HQ',
   'New York' ] } ]
这是我想要的结果,不同的产品和不同的办公室:

[ { _id:
 { CompanyName: 'Facebook',
   HomepageURL: 'http://facebook.com',
   Description: 'Social network',
   NumberofEmployees: 5299,
   TotalMoneyRaised: '$2.43B',
   FoundedYear: 2004,
   CompanyCategory: 'SMALL COMPANY' },
Products:
 [ 'Facebook Platform',
   'Facebook News Feed',
   'Facebook Chat',
   'Facebook Connect',
   'Facebook Mobile',
   'Facebook',
   'Facebook Lite',
   'Facebook Places'  ],
Offices:
 [ 'Headquarters',
   'Europe HQ',
   'New York'] } ]
以下是供参考的数据库:

 {
"_id" : ObjectId("52cdef7c4bab8bd675297d8e"),
"name" : "Facebook",
"homepage_url" : "http://facebook.com",
"description" : "Social network",
"number_of_employees" : 5299,
"total_money_raised" : "$2.43B",
"founded_year" : 2004,
"number_of_employees" : 5299,
"products" : [ 
    {
        "name" : "Facebook Platform",
        "permalink" : "facebook-platform"
    }, 
    {
        "name" : "Facebook News Feed",
        "permalink" : "facebook-news-feed"
    }, 
    {
        "name" : "Facebook Chat",
        "permalink" : "facebook-chat"
    }, 
    {
        "name" : "Facebook Connect",
        "permalink" : "facebook-connect"
    }, 
    {
        "name" : "Facebook Mobile",
        "permalink" : "facebook-iphone-app"
    }, 
    {
        "name" : "Facebook",
        "permalink" : "facebook-zero"
    }, 
    {
        "name" : "Facebook Lite",
        "permalink" : "facebook-lite"
    }, 
    {
        "name" : "Facebook Places",
        "permalink" : "facebook-places"
    }
],
"offices" : [ 
    {
        "description" : "Headquarters",
        "address1" : "1601 Willow Road",
        "address2" : "",
        "zip_code" : "94025",
        "city" : "Menlo Park",
        "state_code" : "CA",
        "country_code" : "USA",
        "latitude" : 37.41605,
        "longitude" : -122.151801
    }, 
    {
        "description" : "Europe HQ",
        "address1" : "",
        "address2" : "",
        "zip_code" : "",
        "city" : "Dublin",
        "state_code" : null,
        "country_code" : "IRL",
        "latitude" : 53.344104,
        "longitude" : -6.267494
    }, 
    {
        "description" : "New York",
        "address1" : "340 Madison Ave",
        "address2" : "",
        "zip_code" : "10017",
        "city" : "New York",
        "state_code" : "NY",
        "country_code" : "USA",
        "latitude" : 40.7557162,
        "longitude" : -73.9792469
    }
],
addtoset查询(不展开):


使用addtoset时,unwind o with the,NULL result也一样,push with unwind起作用(仅1$unwind)

只需将2$push in group stage替换为:它将只“推送”一次值,而不进行重复。

也许您可以使用
$facet
在适当的点将管道分成两个分支@Greg会试试的谢谢你的帮助兄弟!,但是将$push更改为$addtoset会返回空值,我认为在处理子文档时不能使用addtoset@matthPenI更新了我的问题,并在最后添加了文档@Matthpen您使用的是哪个版本?尝试使用$addToSet进行查询,在我的sideversion 4.0.2上运行得非常好,我已经在其他查询中使用了$addToSet,但在嵌套数组上没有使用过。当我使用1$unwind({$unwind:$products}仅限)时,它返回正确的数组,我的问题是当我添加另一个$unwind时,它会从products和Office复制这两个数组。
    col.aggregate([
    {$match: {name: 'Facebook'}},

    //{$unwind: "$products"},
    //{$unwind: "$offices"},

    {$group:{
        "_id":  {
            CompanyName: "$name",
            HomepageURL: "$homepage_url",
            Description: "$description",
            NumberofEmployees: "$number_of_employees",
            TotalMoneyRaised: "$total_money_raised",
            FoundedYear: "$founded_year",
            CompanyCategory:{ $cond: { if: { $gte: [ "$number_of_employees", 10000 ] }, then: "BIG COMPANY", else: "SMALL COMPANY" }}    
            },
            Products: {$addtoset: '$products.name'},             
            //Offices: {$push: '$offices.description'}    
            }
    },

    {$sort:{name: 1}}

]).toArray(function(err, docs) {
    console.log(docs);
    client.close();
});