将简单的List Array键迁移到另一个具有MongoDB中额外属性的键

时间:2015-09-23 08:27:43

标签: javascript mongodb meteor

很抱歉,如果我没有获得正确的术语。以下是我目前使用的MongoDB用户文档db.users

"liked" : [
                "EBMKgrD4DjZxkxvfY",
                "WJzAEF5EKB5aaHWC7",
                "beNdpXhYLnKygD3yd",
                "RHP3hngma9bhXJQ2g",
                "vN7uZ2d6FSfzYJLmm",
                "NaqAsFmMmnhqNbqbG",
                "EqWEY3qkeJYQscuZJ",
                "6wsrFW5pFdnQfoWMs",
                "W4NmGXyha8kpnJ2bD",
                "8x5NWZiwGq5NWDRZX",
                "Qu8CSXveQxdYbyoTa",
                "yLLccTvcnZ3D3phAs",
                "Kk36iXMHwxXNmgufj",
                "dRzdeFAK28aKg3gEX",
                "27etCj4zbrKhFWzGS",
                "Hk2YpqgwRM4QCgsLv",
                "BJwYWumwkc8XhMMYn",
                "5CeN95hYZNK5uzR9o"
        ],

我正在尝试将它们迁移到一个新密钥,该密钥也会捕获用户喜欢帖子的时间

"liked_time" : [
                {
                        "postId" : "5CeN95hYZNK5uzR9o",
                        "likedAt" : ISODate("2015-09-23T08:05:51.957Z")
                }
        ],

我想知道是否可以在MongoDB Shell中使用一个迭代每个用户doc的命令然后遍历所喜欢的数组然后更新并推送新的postId和时间来执行此操作。

或者在JavaScript中执行此操作会更好。我正在使用Meteor。

我几乎让它为个人用户工作。但是想知道我是否可以一次完成所有用户。

var user = Meteor.users.findOne({username:"atestuser"});

var userLiked = user.liked;

      userLiked.forEach(function(entry) {

        Meteor.users.update({ username: "atestuser" },
          { $push: { liked_times: { postId: entry, likedAt: new Date() }}});

        console.log(entry);
      });

显然......对于MongoDB来说还是一个新手......

2 个答案:

答案 0 :(得分:1)

如果这是一次性迁移,我会在一次性js脚本中执行类似的操作。

  • 获取所有用户
  • 对每个用户进行迭代
  • 全部喜欢
  • 迭代他们,得到喜欢

    var liked_times = _.collect(likes, function (likeId) {
      return {
        'postId' : likeId,
        'likedAt':  // get post liked time from like id. 
      }
    });
    
  • 将上述内容插入所选集合中。

注意:

  1. 以上示例使用lodash

  2. 我宁愿将likedAt保存为时间戳。

答案 1 :(得分:1)

这是我真正做得很快的事情你应该在服务器端运行它只需将它放入一个文件,例如root meteor中的“migrate.js”并运行meteor app

if (Meteor.isServer) {
    Meteor.startup(function () {
        var users = Meteor.users.find().fetch();

        users.forEach(function (doc) {
            liked.forEach(function (postId) {
                Meteor.users.update(doc._id, { $push: { liked_times: { postId: postId, likedAt: new Date() } } });
            });
        });
        console.log('finished migrating');
    });
}

p.s我没有测试它