【问题标题】:How do I replace an entire array of subdocuments in MongoDB?如何替换 MongoDB 中的整个子文档数组?
【发布时间】:2014-04-08 11:03:12
【问题描述】:

这是我收藏的示例文档:

Books
[
   id: 1,
   links:
   [
     {text: "ABC", "url": "www.abc.com"},
     {text: "XYZ", "url": "www.xyz.com"}
   ]
]

我想在一次更新操作中替换链接数组。以下是如何修改上述文档的示例:

Books
[
   id: 1,
   links:
   [
     {text: "XYZ", "url": "www.xyz.com"},
     {text: "efg", "url": "www.efg.com"},   <== NEW COPY OF THE ARRAY
     {text: "ijk", "url": "www.ijk.com"}
   ]
]

如您所见,链接数组已被替换(旧数据已删除,新数据已添加)。

我很难使用Update.Set(),因为它说MyLinks&lt;&gt; 不能映射到BsonValue

我尝试了许多不同的方法来实现这一点,但都失败了,包括.PushAllWrapped&lt;WebLinkRoot&gt;("links", myDoc.WebLinks)。 我尝试的所有结果都是将新值附加到数组中,而不是替换数组。

似乎 MongoDB 没有提供简单的方法来替换子文档数组或 .ClearArray() 之类的方法,在单个查询中添加新元素之前,确保清除数组的最佳方法是什么?

【问题讨论】:

  • 您在使用$set 运算符时走在正确的轨道上。这将用您想要的任何内容替换整个字段,在您的情况下,这是一个完全不同的数组。不过,现在无法使用确切的 C# 语法。

标签: mongodb mongodb-query mongodb-.net-driver


【解决方案1】:

我认为你必须这样做:

var newArray = new BSONArray {
    new BSONDocument { { "text", "XYZ" }, { "url", "www.xyz.com" } },
    new BSONDocument { { "text", "efg" }, { "url", "www.efg.com" } },
    new BSONDocument { { "text", "ijk" }, { "url", "www.ijk.com" } }
};

var update = Update.Set( "links", newArray );

collection.Update( query, update );

或者您可以转换为有效 BSONValue 的任何方法。

所以相当于shell:

{ "links" : [ { "text" : "abc" } ] }

> db.collection.update(
      {},
      { $set: 
          { links: [ 
              { text: "xyz", url: "something" },
              { text: "zzz", url: "else" }
          ]}
      })

>db.collection.find({},{ _id: 0, links:1 }).pretty()

{ "links" : [
            {
                    "text" : "xyz",
                    "url" : "something"
            },
            {
                    "text" : "zzz",
                    "url" : "else"
            }
    ]
}

这样就行了。

您显然需要嵌入代码以外的其他内容。但希望这能让你走上正轨。

【讨论】:

  • @kheya 这相当于 shell 语法中的 $set 运算符,其中包含包含文档的整个数组。它应该工作。我不希望你真的在做这件事,但也许还有其他的课程?
【解决方案2】:

我在这里是因为我在这篇文章上看到了 5k 次浏览,我正在添加一些东西可能会帮助其他寻找上述答案的人

 db.collectionName.insertOne({
      'links': [
                 {
                     "text" : "XYZ",
                      "url" : "www.xyz.com"
                  }
        ]
  });

现在运行这个有助于替换旧数据的查询

db.collectionName.update(
      {
        _id: ObjectId("your object Id")
      }, 
      {
        $set: 
         {
          'links':[ {
                     "text" : "XYZ1",
                     "url" : "www.xyz.com1"
                   } ]
         }
      });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 2014-05-28
    • 2021-10-07
    相关资源
    最近更新 更多