折腾:
【未解决】小程序端如何显示换行符使得文字分段显示
期间,想要去更新MongoDB中某个值,是带换行的文字:
![](https://www.crifan.com/files/pic/uploads/2021/03/64dda5fc295a4d7f84cf26c0bcdec39a.jpg)
之前通过Mongo Compass去更新的,发现坑爹的是:表面上更新了,实际上把换行变成空格了。。
所以此处换用mongo shell试试。
换用mongo的命令行去试试能否保存换行的字符
What does the word
先用Mongo Compass中去查找出来:
{"stem_text": {"$regex": "What does the word*"}}
![](https://www.crifan.com/files/pic/uploads/2021/03/91ac58f657904d75a0bda2190eda2779.jpg)
然后再去命令行中试试
➜ ~ mongo --host ip --port port -u user -p pwd --authenticationDatabase authDb MongoDB shell version v3.6.3 connecting to: mongodb://ip:port/ MongoDB server version: 3.2.19 WARNING: shell and server versions do not match Server has startup warnings: 2018-12-21T17:06:59.067+0800 I CONTROL [initandlisten] 2018-12-21T17:06:59.067+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. 2018-12-21T17:06:59.067+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2018-12-21T17:06:59.067+0800 I CONTROL [initandlisten] 2018-12-21T17:06:59.067+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. 2018-12-21T17:06:59.067+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2018-12-21T17:06:59.067+0800 I CONTROL [initandlisten] 2018-12-21T17:06:59.068+0800 I CONTROL [initandlisten] ** WARNING: soft rlimits too low. rlimits set to 4096 processes, 65535 files. Number of processes should be at least 32767.5 : 0.5 times number of files. 2018-12-21T17:06:59.068+0800 I CONTROL [initandlisten] > show dbs admin 0.000GB dialog 0.272GB evaluation 0.318GB exam 0.000GB gridfs 13.869GB local 0.000GB log 0.001GB storybook 0.173GB > use evaluation switched to db evaluation > show collections audio.chunks audio.files evaluation image.chunks image.files question > db.question.findOne db.question.findOne( db.question.findOneAndDelete( db.question.findOneAndReplace( db.question.findOneAndUpdate( > db.question.findOne({"_id": ObjectId("5c1777e1cc6df4563adf4bf6")}) { "_id" : ObjectId("5c1777e1cc6df4563adf4bf6"), "checkpoint" : [ 54, 69, "句子理解" ], "stem_type" : "text", "difficulty" : 3.2, "stem_image" : "", "ave_answer_time" : 25, "audio_text" : "", "audio" : "", "question_number" : 424, "major_type" : "单选", "audio_length" : 0, "max_answer_time" : 50, "stem_text" : "What does the word \"visit\" mean in the sentence below? At Thanksgiving, Tasha will visit her grandparents.", "sub_questions" : [ { "correct_option" : [ 3 ], "options" : [ { "option_index" : 1, "option_text" : "Write a letter to", "option_image" : "" }, { "option_index" : 2, "option_text" : "Say thank you to", "option_image" : "" }, { "option_index" : 3, "option_text" : "Go and spend time with", "option_image" : "" } ], "option_type" : "text", "question_texts" : [ "" ] } ] } >
然后去试试:
db.evaluation.update({"_id": ObjectId("5c1777e1cc6df4563adf4bf6")}, {$set: {"stem_text": "What does the word \"visit\" mean in the sentence below? At Thanksgiving, Tasha will visit her grandparents."}})
其中below?后面,At Thanksgiving前面,是换行符
结果语法错误:
> db.evaluation.update({"_id": ObjectId("5c1777e1cc6df4563adf4bf6")}, {$set: {"stem_text": "What does the word \"visit\" mean in the sentence below? 2018-12-26T10:19:27.781+0800 E QUERY [thread1] SyntaxError: unterminated string literal @(shell):1:89 > At Thanksgiving, Tasha will visit her grandparents."}})
mongodb update text contain new line
mongodb update text contain \n
mongodb text include new line
感觉只有写代码去更新才可以?
意思是:JSON本身就不支持保存值的text的string是多行的string?
mongo json store multiple line
JSON
db.tests.insert( { name: 'test1', text: 'this is ' + 'my superawesome ' + 'multiline content' } )
-》
db.tests.insert( { name: 'test2', text: "this is \nmy superawesome \nmultiline content" } )
【总结】
所以目前的结论是:
JSON语法规范本身
![](https://www.crifan.com/files/pic/uploads/2021/03/d1df489fb7eb4a08b03540a5dfb2206c.gif)
就说了:
- 不能包含换行符
- 换行符属于:控制字符control character
- JSON规范就不支持control character
- JSON规范支持 \n(这是两个字符)
而MongoDB是基于JSON的,所以MongoDB本身不方便保存多行字符串,不是MongoDB的错,而是JSON的规范不支持(的不方便之处)。
想要MongoDB支持多行字符串,可以:
- 方案1:把 单个的表示换行的控制字符 \n ,保存为 “\n”(2个字符,一个是反斜杠,一个是n)
- 这样前端,比如web端,小程序段,移动端等,自己再去替换”\n”为\n
- 方案2:把包含换行的字符串,保存为字符串列表,每个字符串是换行后的某一行
- 比如:
"this is first line and second line"
保存为:
[ "this is first line" "and second line" ]
即可。
转载请注明:在路上 » 【规避解决】MongoDB中如何更新某字段的值为带换行的文字