mongodbtypes更改为数组

我在MongoDB中有一个字段。 {"field": "some text"} ,我想把它们全部转换成数组。 {"field": ["some text"]}

我知道我可以循环遍历所有的文件,获得领域,然后更新,但我想知道是否有一个更清洁的方式。

谢谢。

你可以在map / reduce的Reduce函数中做到这一点,以保持mongodb中的所有处理。 基本上你可以使用map / reduce把结果放到一个新的集合中,然后你可以将它们复制回旧的集合(或者删除旧集合并重命名新的集合)。 这有利于保持mongo内的一切。

更新 :另一个选项可能是你使用db.eval这个。 db.eval在服务器上执行,所以更新将在服务器上完成,没有任何stream量/延迟。

我认为唯一的select就是你所描述的 – 在客户端通过查询和更新每个选项来完成。

上面的Nitin Garg的答案几乎可行,除了他的例子从一个string转换为一个散列,而不是一个数组的string。

考虑到乔尔·哈里斯的评论,正确的解决scheme将如下所示:

 db.jobs.find( { "jobLocationCity" : { $type : 2 } } ).snapshot().forEach( function (x) { x.jobLocationCity = [ jobLocationCity ]; db.jobs.save(x); }); 

或者,如果使用db.eval:

 function f() { db.jobs.find( { "jobLocationCity" : { $type : 2 } } ).snapshot().forEach( function (x) { x.jobLocationCity = [ jobLocationCity ]; db.jobs.save(x); }); } db.eval(f); 

实际上,find({“jobLocationCity”:{$ type:2}})将无法正常工作,因为如果您下次运行更新脚本,它会再次将['mystring']元素视为stringtypes。

你应该使用这样的东西来防止它:

 db.message_info.find( { "jobLocationCity" : { $type : 2 } } ).snapshot().forEach( function (x) { if (!Array.isArray(x.jobLocationCity)){ x.jobLocationCity = [ x.jobLocationCity ]; db.jobs.save(x); } } ) 

http://docs.mongodb.org/manual/reference/operators/

试试这个

这是在mongoDB中将字段的types从string更改为数组

 db.jobs.find( { "jobLocationCity" : { $type : 2 } } ).forEach( function (x) { x.jobLocationCity = {"Location":x.jobLocationCity}; db.jobs.save(x); }); 

请参阅$ type 可能值的链接

但我想知道是否有一个更清洁的方式..

最简洁的答案是不。

MongoDB没有任何单个操作或命令来执行“更改types”。

最快捷的方法是使用其中一个驱动程序并进行更改。 你可以使用shell并且写一个for循环,但是就原始速度而言,其他的驱动可能会更快。

这就是说,这个过程中最慢的部分是将所有的数据从磁盘加载到内存中,然后将这些数据清理回磁盘。 即使有一个神奇的“更改types”命令,情况也是如此。