【问题标题】:Update MongoDB field value only if new providerId not exists仅当新的 providerId 不存在时才更新 MongoDB 字段值
【发布时间】:2019-05-24 13:53:47
【问题描述】:

我在 MongoDB 中有以下文档。

{
    "_id" : ObjectId("5ce34ac6a2f25b2448b9b3a3"),
    "userId" : ObjectId("5ce34ac6a2f25b2448b9b3a0"),
    "providers" : [ 
        "1689736266", 
        "1598763690", 
        "1528069614", 
        "1831364272", 
        "1548463045", 
        "1245301159", 
        "1386616399", 
        "1790775971", 
        "1629462130", 
        "1992169783"
    ],
    "countByType" : {
        "doctors" : 6,
        "labs" : 0,
        "hospitals" : 0,
        "imagingCenters" : 0,
        "other" : 4
    }
}

我不确定如何在 providers 数组中检查新的 providerId,如果不存在则使用单个查询操作进行更新。所以首先我需要检查一个特定的providerId是否存在,如果不存在则更新providers字段,否则忽略它。

我该如何实现?

【问题讨论】:

  • "如果不存在则更新提供者字段,否则忽略它。" - 你能澄清那部分吗?如果该值不存在或者您想做其他事情,您要推送它吗?
  • @mickl 是的,如果值不存在,我想将提供者 ID 推送到数组中,以便将其添加到现有数组的末尾......

标签: node.js mongodb mongodb-query aggregation-framework mongo-collection


【解决方案1】:

我认为您需要的是 $addToSet 运算符。您可以添加多个值而不必担心附加重复项,如下所示:

db.test.update(
 {userId : ObjectId("5ce34ac6a2f25b2448b9b3a0")},
 {$addToSet  : {providers : { $each:["1","1689736266", "23"]} }}
)

【讨论】:

  • 一个疑问我已经使用以下查询来更新提供者和计数: let updateProviderId = await userProviderCollection.update( regUserId, { $set: { providers: providernpiId, countByType: providercountType } });其中 providernpiId 是完整数组,而不是单个元素。所以如果我使用 {$addToSet : {providers : { $each:["1","1689736266", "23"]} }} 这会覆盖现有的数组吗?
  • 不会的。它只是附加到现有数组
【解决方案2】:

根据文档“$addToSet 运算符向数组添加一个值,除非该值已经存在,在这种情况下,$addToSet 对该数组没有任何作用。”。当您尝试在提供程序数组中同时添加多个值时,也会出现这种情况吗?如果你然后使用 $each 否则你将不需要 $each。

【讨论】:

  • 我已经在数组中有一些值,我将它们更新为整个数组。在这种情况下,我有一些数组值,我需要检查它们是否存在于数组中,而不是单个值,而是作为单个数组。所以在这种情况下我应该选择哪一个..
  • 在这种情况下,您应该使用 $addToSet 和 $each 选项。与@bajal 的回答相同。所以 $each 将检查新数组中的每个值, $addToSet 检查该值是否存在于提供程序中,如果不插入则不做任何事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多