node.js - 在组中展开两个嵌套数组 mongodb nodejs
问题描述
查询中是否可以接受两种$unwind
方法?我正在尝试获取两个文档的所有不同子文档。NodeJS
MongoDb
这是我的查询:
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
and的结果Offices
:
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 查询(无展开):
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();
});
unwind o 也是如此
解决方案
只需将小组赛中的 2 $push 替换为$addToSet:它只会“推送”一次值,不会重复
推荐阅读
- angular - 在 Angular 6 中从控制台隐藏 IE 警告
- javascript - 元素句柄的 Puppeteer 循环不起作用
- java - 在 ClientInterceptor 上使用 grpc-java 在元数据中包含消息哈希?
- c# - 有没有一种简单的方法来检查 ICollection 中的所有元素是否
> 相同吗? - d3.js - 为什么我得到一个未捕获的 ReferenceError 标签未定义?
- html - PrimeNG TreeTable rowNode 不工作
- mysql - 当网络如此缓慢时如何将相同的数据停止到数据库中
- wpf - 重新设置 WinForm 应用程序中托管的 WPF 控件的样式
- ibm-cloud-private - 我可以使用本地 Eclipse 和在 IBM Cloud Private 上运行的小气候吗?
- excel - 将时间戳引用到另一个工作簿