如何在 mongoDB 的嵌入式文档中提取特定元素

Posted

技术标签:

【中文标题】如何在 mongoDB 的嵌入式文档中提取特定元素【英文标题】:How to pull specific element in embedded document in mongoDB 【发布时间】:2018-08-03 15:18:25 【问题描述】:

我有一个 MongoDB 嵌入式文档,其中包含许多数组文档。

前:


    "_id" : ObjectId("594b7b7d4064e264420e38d0"),
    "UnitId" : "594b75d44064e264420e3869",
    "UnitName" : "PARKING",
    "UnitIcon" : "./upload/file-1498117588607.jpg", 
    "Stream" : 
        "_id" : ObjectId("594b7b7d4064e264420e38d1"),
        "Types" : [ 
            
                "TypeId" : "594b9a884064e264420e3b56",
                "TypeName" : "TR/RC",
                "Travel" : false
            , 
            
                "TypeId" : "594b9a844064e264420e3b55",
                "MaterialStreamName" : "RW",              
                "Travel_Required" : false
            , 
            
                "TypeId" : "594b9a9d4064e264420e3b58",
                "TypeName" : "ST",               
                "Travel_Required" : true
            , 
            
                "TypeId" : "594b9a764064e264420e3b53",
                "TypeName" : "FD",               
                "Travel_Required" : true
            
        ]
       
,
    "_id" : ObjectId("594b7b7d4064e264420e38d1"),
    "UnitId" : "594b75d44064e264420e3870",
    "UnitName" : "CAFE",
    "UnitIcon" : "./upload/file-1498117588608.jpg", 
    "Stream" : 
        "_id" : ObjectId("594b7b7d4064e264420e38d2"),
        "Types" : [ 
            
                "TypeId" : "594b9a884064e264420e3b56",
                "TypeName" : "TR/RC",
                "Travel" : false
            , 
            
                "TypeId" : "594b9a844064e264420e3b55",
                "MaterialStreamName" : "RW",              
                "Travel_Required" : false
            , 
            
                "TypeId" : "594b9a9d4064e264420e3b58",
                "TypeName" : "ST",               
                "Travel_Required" : true
            , 
            
                "TypeId" : "594b9a764064e264420e3b53",
                "TypeName" : "FD",               
                "Travel_Required" : true
            
        ]
       
,
    "_id" : ObjectId("594b7b7d4064e264420e38d2"),
    "UnitId" : "594b75d44064e264420e3870",
    "UnitName" : "CAFE",
    "UnitIcon" : "./upload/file-1498117588608.jpg", 
    "Stream" : 
        "_id" : ObjectId("594b7b7d4064e264420e38d3"),
        "Types" : [                 
            
                "TypeId" : "594b9a9d4064e264420e3b58",
                "TypeName" : "ST",               
                "Travel_Required" : true
            ,     
            
                    "TypeId" : "594b9a884064e264420e3b56",
                    "TypeName" : "TR/RC",
                    "Travel" : false
                , 
                
                    "TypeId" : "594b9a844064e264420e3b55",
                    "MaterialStreamName" : "RW",              
                    "Travel_Required" : false
                , 
                
                    "TypeId" : "594b9a764064e264420e3b53",
                    "TypeName" : "FD",               
                    "Travel_Required" : true
                
            ]
           
    

我有许多包含 UnitID 和 TypeID 组合的文档(在 Types 对象内)。我必须通过匹配 UnitId 和 TypeID 来删除该 Type 元素。我使用了 $pull 但没有实现。

    db.getCollection('units_details').update(
     "UnitId" : "594b75d44064e264420e3870","Stream[0].Types.$.TypeID" : "594b9a884064e264420e3b56"    , 
     $pull:  "Stream[0].Types"            
                 "TypeId" : "594b9a884064e264420e3b56",
                        "TypeName" : "TR/RC",                            
                        "Travel" : false
            ,multi:true

    );

如何实现删除types数组中types数组中的type顺序发生变化的元素。

【问题讨论】:

您的文件是否正确?我没看到Material_Stream_Flow_Details @Veeram 已编辑,请立即查看 db.getCollection('units_details').update( "UnitId" : "594b75d44064e264420e3870", $pull: "Stream.Types" : "TypeId" : "594b9a884064e264420e3b56", "TypeName" : "TR/RC", "Travel" : false ,multi:true ); 之类的东西应该可以工作 @Veeram 流还有一个数组有一些元素。类型在 [0] 位置 请更新您的文件。它将流显示为嵌入式文档 【参考方案1】:

您可以使用以下任一查询来查询嵌套数组。

db.getCollection('units_details').update(
  "UnitId":"594b75d44064e264420e3870","Stream.Types.TypeId":"594b9a884064e264420e3b56",
  "$pull":
    "Stream.$.Types":
      "TypeId":"594b9a884064e264420e3b56",
      "TypeName":"TR/RC",
      "Travel":false
  ,
  "multi":true
);

OR(更适用于多条件场景)

db.getCollection('units_details').update( 
    "UnitId":"594b75d44064e264420e3870",
    "Stream":
      "$elemMatch":
        "Types":
          "$elemMatch":"TypeId":"594b9a884064e264420e3b56"
        
      
    
  ,
  "$pull":
    "Stream.$.Types":
      "TypeId":"594b9a884064e264420e3b56",
      "TypeName":"TR/RC",
      "Travel":false
  ,
  "multi":true
 )

【讨论】:

感谢您的快速帮助。第二个查询正在工作,但第一个查询不工作,我怀疑这是由于条件Stream.Types.TypeId 中的类型的位置。 你能帮忙解决这个问题吗***.com/q/51474838/5756149

以上是关于如何在 mongoDB 的嵌入式文档中提取特定元素的主要内容,如果未能解决你的问题,请参考以下文章

如何匹配 MongoDB 中嵌入式数组或文档中的字符串?

MongoDB请求:仅从嵌入数组中的嵌入文档中过滤特定字段

通过 Mongoose、Node.js、MongodB 中的特定属性查找嵌入式文档

MongoDB 中嵌入文档的数组元素的并发更新

如何在 MONGODB 的嵌套文档数组中提取文档

嵌入文档上的 mongodb 索引