在MongoDB中展开查找操作的结果时丢失记录

时间:2017-04-14 03:40:27

标签: mongodb mongodb-query

我的“预订”表上有一个looong查询,除非我要求代理人,否则它会很有效。

我们有一个“用户”表。该表包含用户,管理员,代理等。

“预订”总是有一个“用户”,因此$ lookup总是很顺利。

“预订”SOMETIMES有一个“代理人”,但大部分时间该字段为空白“”。因此,当我执行$ lookup时,它会中断整个查询并且不返回任何内容。

我想进行$ lookup,但只有“agent”字段不为空。 或者找到一种方法,如果$ lookup失败,它不会破坏整个查询。

左侧是实际存在包含有效users._id的“agent”字段时 - 这里我们得到结果

右侧是“代理”字段缺失时,包含空值或包含无效值。 - 这里打破了整个查询。

enter image description here

以下是试用数据的示例

        TableColumn< ModelInput, String > colCalibration = new TableColumn<>( "Calibration" );
        TableColumn< ModelInput, String > colSamplingX = new TableColumn<>( "Sampling point X" );
        TableColumn< ModelInput, String > colSamplingY = new TableColumn<>( "Sampling point Y" );
        List< TableColumn< ModelInput, String > > tableColList =
            Stream.of( colCalibration, colSamplingX, colSamplingY )
                  .collect( Collectors.toList() );
        tableviewCalibMatching.getColumns().addAll( tableColList );

        //initialize
        colCalibration.setCellFactory( param -> new TableCell< ModelInput, String >() {

          @Override
          public void updateItem( String item, boolean empty ) {
            super.updateItem( item, empty );
            if( empty ) {
              setText( null );
            } else {
              ComboBox< String > comboBoxCalibMatchingNames = new ComboBox<>( listCalibNames );
              comboBoxCalibMatchingNames.setPrefWidth( splitWidth );
              comboBoxCalibMatchingNames.getSelectionModel().selectedItemProperty()
                                        .addListener( (ChangeListener< String >)( observable, oldValue,
                                            newValue ) -> {

//TODO
//How can I get ComboBox of other TableColumn, need to set according to current //selection

                                        } );
              setGraphic( comboBoxCalibMatchingNames );
              setContentDisplay( ContentDisplay.GRAPHIC_ONLY );
            }
          }
        } );

        colSamplingX.setCellFactory( param -> new TableCell< ModelInput, String >() {

          @Override
          public void updateItem( String item, boolean empty ) {
            super.updateItem( item, empty );
            if( empty ) {
              setText( null );
            } else {
              final ComboBox< String > comboBox = new ComboBox<>();
              setGraphic( comboBox );
              setContentDisplay( ContentDisplay.GRAPHIC_ONLY );
            }
          }
        } );

        colSamplingY.setCellFactory( param -> new TableCell< ModelInput, String >() {

          @Override
          public void updateItem( String item, boolean empty ) {
            super.updateItem( item, empty );
            if( empty ) {
              setText( null );
            } else {
              final ComboBox< String > comboBox = new ComboBox<>();
              setGraphic( comboBox );
              setContentDisplay( ContentDisplay.GRAPHIC_ONLY );
            }
          }
        } );

1 个答案:

答案 0 :(得分:3)

当您将$lookup的结果传递给$unwind时,会出现问题,该结果的目标是查找结果数组所在的结果字段,查找操作的空结果将通过展开来删除,其中数据发生了。回溯您的聚合逻辑并将preserveNullAndEmptyArrays选项添加到有罪的$unwind步骤中。这将阻止在该步骤中丢失记录,从而解决您的麻烦。