mongodb - 获取不同的嵌入文档
问题描述
我有一个包含这样的元素的集合:
{
"_id": {
"$oid": "56d61033a378eccde8a8354f"
},
"id": "10021-2015-ENFO",
"certificate_number": 9278806,
"business_name": "ATLIXCO DELI GROCERY INC.",
"date": "Feb 20 2015",
"result": "No Violation Issued",
"sector": "Cigarette Retail Dealer - 127",
"address": {
"city": "RIDGEWOOD",
"zip": 11385,
"street": "MENAHAN ST",
"number": 1712
}
}
我想要的是_id
为每个address
. 这是一次性操作,我这样做是为了研究/测试目的。
我认为我可以将任务分为以下步骤:
- 获取所有唯一地址并用它们创建单独的集合,
_id
为每条记录分配(如我所读,如果未指定,将添加它) - 通过所有
address
字段进行连接,以便为_id
源集合中的每个嵌入文档插入对应的
我选择这样的文件:
db.ci.find({}, {"address":1, "_id":0});
但我无法使用Distinct
函数或foreach
. 我也尝试使用aggregate
,但没有成功。
谁能给我一些提示?
我正在使用 Ubuntu 20.04、mongodb 4.2.7 和带有mongodb 扩展的代码。
解决方案
您可以在单个聚合中获得一个唯一整数,方法是使用$facet
保留原始文档,同时使用$addToSet
获取唯一地址列表,并将$indexOfArray
值分配给每个文档:
db.collection.aggregate([
{$facet: {
docs: [{$match: {}}],
addresses: [
{$group: {
_id: null,
address: {$addToSet: "$address"}
}}
]
}},
{$unwind: "$docs"},
{$unwind: "$addresses"},
{$addFields: {
"address.id": {
$indexOfArray: [
"$addresses.address",
"$docs.address"
]
}
}},
{$replaceRoot:{newRoot:"$docs"}},
{$out:"new_collection"}
])
如果您更喜欢 ObjectId,那么您有正确的想法,将唯一地址输出到临时集合的一个聚合,因此每个都自动分配一个 _id,然后第二个聚合将这些 _id 值嵌入到原始文档中。对于此示例,我收集了原始文档的 _id 以简化以后的查找。
db.collection.aggregate([
{$group:{
_id:"$address",
ids:{$push:"$_id"}
}},
{$project:{
address:"$_id",
ids:1,
_id:0
}},
{$out: "temp_address_collection"}
])
db.collection.aggregate([
{$lookup:{
from:"temp_address_collection",
localField:"_id",
foreignField:"ids",
as: "matched"
}},
{$addFields:{matched:{$arrayElemAt:["$matched",0]}}},
{$addFields:{"$address.id": "$matched._id"}},
{$project:{matched:0}},
{$out:"new_collection"}
])
推荐阅读
- haskell - 如何将 [Maybe Text] 与镜头连接?
- extjs - ExtJS 6 Ext.field.Date 不包含 Ext.panel.Date 的标题
- wordpress - 如何在wordpress中只获取至少有一个孩子的父页面?
- c++ - 如何将着色器中生成的浮点数据而不是颜色拉回 CPU?
- solidity - uint256 对于weis 的数量还不够吗?
- algorithm - ACM 问题:长字符串的不同子字符串的数量
- swift - 如何检查 RXSwift 中的 observable 是否为空?
- c# - v2 上 C# 中的 Azure 函数 - 如何访问门户应用程序设置
- sql - 求和数据并选择PK中的最大值
- android - 如何使用 Expandable 关闭 NavigationView 中的组菜单