最小化长mongo声明

时间:2015-09-08 22:42:29

标签: javascript node.js mongodb

这个mongo插入这么长并且需要5次调用的原因是here (Managing database with content-addressable hash),我希望这使得这更有意义/不那么冗长。是否有一个我缺少的功能允许我根据数组中的值进行有条件的upsert。

function insert (user, type, data, name) {
  var hash = util.getHash(data)
  var collection = db.collection('content')
  return collection.find({
    'user': user,
    'type': type,
    'hash': hash,
    'meta.name': name
  }).toArray().then(function (arr) {
    if (!arr.length) {
      return collection.find({
        'user': user,
        'type': type,
        'hash': hash
      }).toArray().then(function (arr) {
        if (!arr.length) {
          return collection.insert({
            'user': user,
            'type': type,
            'hash': hash,
            'date': new Date(),
            'data': data,
            'meta': [
              {
                'name': name
                'date': new Date()
              }
            ],
          })
        } else {
          return collection.update({
            'user': user,
            'type': type,
            'hash': hash,
            'meta.name': name
          }, {
            '$push': {
              'meta': {
                'name': name
                'date': new Date()
              }
            }
          })
        }
      })
    } else {
      return collection.update({
        'user': user,
        'type': type,
        'hash': hash,
        'meta.name': name
      }, {
        '$push': {
          'meta': {
            'date': new Date()
          }
        }
      })
    }
  })
}

1 个答案:

答案 0 :(得分:0)

这是一个电话,唯一的问题是它每次都会更新name,如果name,我希望不更新name存在于meta数组中。

function insert (user, type, data, name) {
  var content = {
    'user': user,
    'data': data,
    'hash': util.getHash(data),
    'date': new Date()
  }
  var collection = db.collection('contents')
  return collection.update({
    'user': content.user,
    'type': content.type
  }, {
    '$setOnInsert': content,
    '$push': {
      'meta': {
        'name': name,
        'date': new Date()
      }
    }
  }, {
    'upsert': true
  })
}