我的“预订”表上有一个looong查询,除非我要求代理人,否则它会很有效。
我们有一个“用户”表。该表包含用户,管理员,代理等。
“预订”总是有一个“用户”,因此$ lookup总是很顺利。
“预订”SOMETIMES有一个“代理人”,但大部分时间该字段为空白“”。因此,当我执行$ lookup时,它会中断整个查询并且不返回任何内容。
我想进行$ lookup,但只有“agent”字段不为空。 或者找到一种方法,如果$ lookup失败,它不会破坏整个查询。
左侧是实际存在包含有效users._id的“agent”字段时 - 这里我们得到结果
右侧是“代理”字段缺失时,包含空值或包含无效值。 - 这里打破了整个查询。
以下是试用数据的示例
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 );
}
}
} );
答案 0 :(得分:3)
当您将$lookup
的结果传递给$unwind
时,会出现问题,该结果的目标是查找结果数组所在的结果字段,查找操作的空结果将通过展开来删除,其中数据发生了。回溯您的聚合逻辑并将preserveNullAndEmptyArrays
选项添加到有罪的$unwind
步骤中。这将阻止在该步骤中丢失记录,从而解决您的麻烦。