在node.js中,如果值是唯一的,则只插入Mongodb,否则更新

16

最近我开始开发一个应用程序,终于让我的node.js服务器与mongodb数据库通信。

我想插入一堆看起来像这样的JSON对象:

   {
    'Username': 'Bob',
    'longitude': '58.3',
    'latitude': '0.3'
   }
如果将该对象插入到myCollection中,然后再次尝试使用用户名Bob插入对象,但坐标不同,我希望最新的“Username”为“Bob”的对象替换掉早期的对象。基本上,myCollection中只能有一个“Username”为“Bob”的对象。

如果这是关系型数据库,我会将Bob设置为主键之类的东西,但我想知道在mongoDb中做到这一点的最佳方法是什么?我应该使用update+upsert方法吗?我尝试了,但似乎没有起作用!

如果这听起来像个愚蠢的问题,请谅解,因为我还是个新手。

1个回答

33

是的,使用upsert选项的简单update查询应该满足您的用例:

db.collection.update(
   {username:"Bob"},
   {$set:{'longitude': '58.3', 'latitude': '0.3'}},
   { upsert: true}
)

当您第一次运行上面的查询时(即,Bob不存在于集合中),将创建一个新文档。但是,当您第二次使用新的lat / long值运行它时,现有文档将使用新的lat / long值进行更新。
您还可以在username字段上创建唯一索引,以防止意外创建多个“Bob”的记录:
db.collection.ensureIndex( { "username": 1 }, { unique: true } )

编辑:

db.collection.ensureIndex()现已弃用,是db.collection.createIndex()的别名。因此,请使用db.collection.createIndex()来创建索引。


1
谢谢!如果在$set字段中,我同时包含了“用户名:Bob”字段以及经度和纬度,会怎样呢?此外,使用update的ensure index有什么好处吗?再次感谢! - DeaIss
$set 可以包含 'username':'Bob'。除了 _id 字段,我们可以修改任何其他字段。 _id 字段是不可变的。是的,在这种情况下创建一个索引(即使是非唯一的)会有所帮助,因为我们正在通过 username 查询集合。如果没有索引存在,它将进行完整的集合扫描。创建索引有助于更快地找到文档。如果需要,您可以指定 unique 选项。 - Anand Jayabalan
针对此更新,db.collection.ensureIndex()现已弃用,并且是db.collection.createIndex()的别名。 - Victor Zamanian
如果我有更多的字段,即非唯一字段,不包含在查询中,也不想更改,但是如果查询返回null,我想要插入它们,但在更新时仍然保持相同,我应该在哪里包括它们?在$set中吗? - WesternGun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接