如果不存在则插入,如果存在则更新。

3

我正在使用这个API获取用户信息。

https://redmine-mock-api.herokuapp.com/api/v1/users

总共有100个用户(100个不同的id)。 我使用mongoose将它们添加到了我的mongodb数据库中,但问题是它总是重复添加(我已经有5000个用户(50次重复100个用户))。

如果id不存在,我想添加它,如果存在则更新它。

我做错了什么?users 是从API返回的用户数组。

 db.collection("users").insertMany(users, function (error, response) {
                        if (error) throw error;
                        console.log("Number of users inserted: " + response.insertedCount);
                        db.close();
                    });

我认为你只需要知道术语,才能在这里成功进行网络搜索。_插入或更新_的概念被称为__upsert__。您可以在更新上设置upsert标志。尝试搜索mongodb upsert - Wyck
3个回答

3

尝试以下格式

db.collection.update({'_id': Id}, //Find with the unique identifier
                     {//put whatever you want to insert},
                     {upsert: true}
                    )

ReferenceError: Id未定义。 - John
请在此处添加您的查询。 - Priyanka Kariya
哪个查询?我只是从 Web 服务获取用户数组,并使用上面的代码将它们插入。没有别的。 - John
嗨John,你的唯一标识列是什么?请将其添加到_id之处。 - Priyanka Kariya
Id 出了错误,请检查 API。我想将这些用户插入我的 MongoDB。 - John

0

mongo db文档上看,insertMany似乎不是你想要在这里使用的。你可能想要使用updateMany,因为它支持upserts,而insertMany则不支持。

你应该可以像下面这样使用:

db.collection("users").updateMany(
   {},
   users,
   {
     upsert: true
   }
)

这是使用空过滤器,如果该项不存在,则插入,如果存在则更新。


MongoError:更新操作文档必须包含原子操作符。 - John
你能否添加一个用户数据的示例? - Alistair Nelson

0
db.collection.updateMany(
   <filter>,
   <update>,
   {
     upsert: <boolean>
   }
)

updateMany() 方法接受以下参数:


过滤器
更新的选择条件。与find()方法中相同的查询选择器可用。

  • 指定一个空文档{ }以更新集合中的所有文档。

更新
要应用的修改。

  • 使用更新运算符,如$set、$unset或$rename。

Upsert
可选。当为true时,updateMany()会执行以下操作之一:

如果没有文档与过滤器匹配,则创建一个新文档。有关详细信息,请参见upsert行为。 更新与过滤器匹配的文档。 为避免多次upsert,请确保过滤器字段具有唯一索引。

默认为false。

db.users.updateMany(
       {},
       {$set: users},
       {
         upsert: true
       }
    )

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