如果数组

时间:2015-07-09 19:13:41

标签: javascript node.js mongodb

如果数据库中尚未存在$push,我想将变量content content放入数据库content.hash。我不想再次不必要地存储信息。

return shops.updateAsync({
  "user": user
}, {
  "$push": {
    "content": content
  }
})

我有一个content对象,包含以下参数。

content = {
  "type": "csv",
  "name: "my-csv.csv",
  "content": csvContent,
  "date": new Date(),
  "hash": hash.digest('hex')
}

我不希望将相同的CSV插入到数组中。我想通过检查哈希来确保只有一个,如果数组中有一个内容对象,它将不会上传或覆盖它。

这是我到目前为止所得到的,这是3个请求:(

return users.findOneAsync({
  "user": user,
  "content.hash": content.hash,
}).then(function(exists){
  if(!exists) return false
  return users.updateAsync({
    "user": user
  }, {
    "$pull": { "content": { "hash": content.hash } },
  })
}
}).then(function(){
  return users.updateAsync({
    "user": user,
  }, {
    "$push": {"content": content}
  })
})

1 个答案:

答案 0 :(得分:1)

不完全确定您的数据是什么样的,但我认为它与我在另一个帖子中给出的答案非常接近。 TLDR;独特的子文件。

https://stackoverflow.com/a/29102690/1058776

这出现在谷歌中,所以我想我会添加一个替代方法来使用索引来实现像子文档中的功能一样的唯一键约束,希望没问题。

我对Mongoose并不十分熟悉,所以它只是一个mongo控制台更新:

var foo = { _id: 'some value' }; //Your new subdoc here

db.yourCollection.update(
{ '_id': 'your query here', 'myArray._id': { '$ne': foo._id } },
{ '$push': { myArray: { foo } })

文档看起来像:

{
  _id: '...',
  myArray: [{_id:'your schema here'}, {...}, ...]
}

如果你的子文档密钥已经存在,那么确保更新的关键不会返回要更新的文档(即查找部分)。