MongoDB-从以逗号分隔值的集合中选择不同的值

MongoDB-从以逗号分隔值的集合中选择不同的值,mongodb,distinct,Mongodb,Distinct,要从DB和名为“name”的集合中获取不同值的列表,只需执行以下操作: db.name.distinct('names') 但是,我继承了一个MongoDB,其中名称包含用逗号分隔的值。 这样做db.name.distinct('names')将返回包含如下值的JSON: names -------- [ "name1,name2", "name2,name3", "name4,name1,name3" ] names ------

要从DB和名为“name”的集合中获取不同值的列表,只需执行以下操作:

db.name.distinct('names')
但是,我继承了一个MongoDB,其中
名称
包含用逗号分隔的值。 这样做
db.name.distinct('names')
将返回包含如下值的JSON:

names
--------
[
"name1,name2",
"name2,name3",
"name4,name1,name3"
]
names
--------
[
"name1",
"name2",
"name3",
"name"
]
我需要从“名称”中获取不同值的列表,因此看起来如下所示:

names
--------
[
"name1,name2",
"name2,name3",
"name4,name1,name3"
]
names
--------
[
"name1",
"name2",
"name3",
"name"
]

是否需要以编程方式执行此操作?

将其缩减为具有拆分成员的新数组。 然后减少,只保留不同的成员。 或与空数组联合,以仅保持

请参阅下面的代码,如果要更新集合,请使用更新中的管道

=mongodb 4.2允许使用管道更新

>使用testdb
切换到db testdb
>db.testcoll.drop()
真的
>插入({“名称”:[“名称1,名称2”,“名称2,名称3”,“名称4,名称1,名称3”]})
WriteResult({“n插入”:1})
>db.testcoll.aggregate([
...     {
…“$addFields”:{
…“拆分名称不同”:{
…“$setUnion”:[
...             {
…“$reduce”:{
…“输入”:“$names”,
…“初始值”:[],
…“在”:{
…“$let”:{
…“vars”:{
…“拆分名称”:“$$value”,
…“m”:“$$this”
...                     },
…“在”:{
…“$concatarray”:[
…“$$splittedNames”,
...                         {
…“$split”:[
…“$$m”,
...                             ","
...                           ]
...                         }
...                       ]
...                     }
...                   }
...                 }
...               }
...             },
...             []
...           ]
...         }
...       }
...     }
…漂亮的
{
“_id”:ObjectId(“5f92d0026613edf695aa407a”),
“姓名”:[
“名字1,名字2”,
“名字2,名字3”,
名称4、名称1、名称3
],
“splittedNamesDistinct”:[
“名称1”,
“名称2”,
“名称3”,
“名称4”
]
}
>db.testcoll.aggregate([
...     {
…“$addFields”:{
…“拆分名称”:{
…“$reduce”:{
…“输入”:“$names”,
…“初始值”:[],
…“在”:{
…“$let”:{
…“vars”:{
…“拆分名称”:“$$value”,
…“m”:“$$this”
...                 },
…“在”:{
…“$concatarray”:[
…“$$splittedNames”,
...                     {
…“$split”:[
…“$$m”,
...                         ","
...                       ]
...                     }
...                   ]
...                 }
...               }
...             }
...           }
...         }
...       }
...     },
...     {
…“$addFields”:{
…“拆分名称不同”:{
…“$reduce”:{
…“输入”:“$splittedNames”,
…“初始值”:[],
…“在”:{
…“$let”:{
…“vars”:{
…“splittedNamesDistinct”:“$$value”,
…“m”:“$$this”
...                 },
…“在”:{
…“$cond”:[
...                     {
…“$in”:[
…“$$m”,
…“$$splittedNamesDistinct”
...                       ]
...                     },
…“$$splittedNamesDistinct”,
...                     {
…“$concatarray”:[
…“$$splittedNamesDistinct”,
...                         [
“$$m”
...                         ]
...                       ]
...                     }
...                   ]
...                 }
...               }
...             }
...           }
...         }
...       }
...     }
…漂亮的
{
“_id”:ObjectId(“5F92CE7C51145B0744FCBE”),
“姓名”:[
“名字1,名字2”,
“名字2,名字3”,
名称4、名称1、名称3
],
“拆分名称”:[
“名称1”,
“名称2”,
“名称2”,
“名称3”,
“名称4”,
“名称1”,
“名称3”
],
“splittedNamesDistinct”:[
“名称1”,
“名称2”,
“名称3”,
“名称4”
]
}
您可以试试

  • $reduce
    将数组命名为输入,
    $split
    值与
    一起返回数组,
    $setUnion
    将加入数组并从集合中获取联合/唯一数组


如果希望所有记录的名称都是唯一的,请尝试

  • $project
    已跳过,与上面的查询相同
  • $unwind
    解构名称数组
  • $group
    按null设置,并使用
    $addToSet

非常感谢您的时间和经验。。。谢谢,这很有效,我能再问你一个问题吗?似乎有些值是用一个逗号分隔的:“,”,但有些值是用逗号和空格分隔的:“,”或“,”。知道如何处理吗?现在我正在努力排序输出,添加{$sort:{names:-1}}似乎不起作用。有什么建议吗?这里有一个新的例子: