MongoDB-从以逗号分隔值的集合中选择不同的值
要从DB和名为“name”的集合中获取不同值的列表,只需执行以下操作: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.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
按null设置,并使用$group
$addToSet
非常感谢您的时间和经验。。。谢谢,这很有效,我能再问你一个问题吗?似乎有些值是用一个逗号分隔的:“,”,但有些值是用逗号和空格分隔的:“,”或“,”。知道如何处理吗?现在我正在努力排序输出,添加{$sort:{names:-1}}似乎不起作用。有什么建议吗?这里有一个新的例子: