如何实现这个mongodb查询&;更新操作(CSharp驱动程序)?

如何实现这个mongodb查询&;更新操作(CSharp驱动程序)?,mongodb,mongodb-.net-driver,Mongodb,Mongodb .net Driver,我有这个收藏: Books [ { title: Book1, References: [ObjectId(1), ObjectId(3), ObjectId(5)] <- These are object ids of another collection Main-Reference: ObjectId(5) }, { title: Book2, References: [ObjectId(2), ObjectId(5), ObjectId(7)] Main-

我有这个收藏:

Books
[
{
  title: Book1,
  References: [ObjectId(1), ObjectId(3), ObjectId(5)] <- These are object ids of another collection
  Main-Reference: ObjectId(5)
},
{
  title: Book2,
  References: [ObjectId(2), ObjectId(5), ObjectId(7)] 
  Main-Reference: ObjectId(5)
}
{
  title: Book3,
  References: [ObjectId(5), ObjectId(7), ObjectId(9)] 
  Main-Reference: ObjectId(7)
},
]
书籍
[
{
书名:第一册,

参考文献:[ObjectId(1),ObjectId(3),ObjectId(5)]如果我基本上理解了你的要点,你基本上想

  • 从引用数组中提取不需要的项
  • 将主引用字段的值设置为修改后数组的第一个元素
  • 并在一次更新中完成所有更新,而无需跨网络移动文档

    但遗憾的是,这无法做到。主要问题是,无法引用正在更新的文档中另一个字段的值。即使如此,要在不进行迭代的情况下执行此操作,您还需要访问已更改的数组,以获取新的第一个元素

    也许一种方法是重新思考您的模式,以实现您想要的。我在这里的选择是稍微扩展您的引用文档,并删除对主引用字段的需要

    似乎你愿意在更新中生活的假设是,如果删除的引用是主引用,那么你可以将新的主引用设置为数组中的第一个元素。

    refs: [ { oid: "object1" }, { oid: "object2" }, { oid: "object5", main: true } ]
    
    通过将这些文档更改为具有将设置为ObjectId的
    oid
    属性的文档,可以在文档上提供一个附加属性的选项,该属性指定默认属性。可以轻松查询该属性,以确定哪个Id是主引用

    现在也考虑如果OID字段中的文档匹配“Objt5”被从数组中拉出来会发生什么:

    refs: [ { oid: "object1" }, { oid: "object2" } ]
    
    因此,当您按照前面的逻辑查询
    主引用
    时,您接受数组中的第一个文档。当然,根据您的应用程序要求,如果您想设置不同的
    主引用
    ,只需更改文档即可

    refs: [ { oid: "object1" }, { oid: "object2", main: true } ]
    
    现在的逻辑仍然是选择主属性为true的数组元素,如上图所示,如果该属性不存在于任何元素文档中,则返回到第一个元素

    所有这些都消化后,从所有文档中的数组中提取对对象的所有引用的操作变得非常简单,就像在shell中所做的那样(相同的格式基本上应适用于任何驱动程序):

    查询和更新操作的两个额外参数分别是
    upsert
    multi
    。在这种情况下,
    upsert
    没有多大意义,因为我们只想修改存在的文档,
    multi
    意味着我们想更新匹配的所有内容。默认情况是只更改第一个d文件

    当然,我缩短了所有的符号,但根据您的意图,这些值可以是实际的ObjectId。还可以合理地假设,您的
    主引用
    的主要用法是在检索文档后使用。按照概述的逻辑定义一个返回
    主引用
    的查询应该是可能的,但就目前情况而言,我在这里输入了很多内容,需要休息一下吃晚饭:)


    我认为这是一个值得重新思考的案例,可以避免对您想要实现的目标进行过度迭代。

    FYI。我开始询问如何查询伪主引用[here}()这有一些有趣的活动。我非常确定那里的所有东西都已经作为一个可接受的解决方案应用于扩展我的建议。感谢您的回复。扩展引用数组是不可能的。这很遗憾。目前,如果不迭代所有站点,您将无法实现您想要的更新ms您想更改。在项目内移动哪个项目是主要引用的指标是我能看到的避免这种情况的唯一方法。如果架构不是您的决定,那么可能值得尝试说服负责人。
    refs: [ { oid: "object1" }, { oid: "object2", main: true } ]
    
    db.books.update(
       { "refs.oid": "object5" },
       { $pull: { refs: {oid: "object5"} } }, false, true )