MongoDB -如何有条件地选择字段

q5lcpyga  于 2023-03-29  发布在  Go
关注(0)|答案(2)|浏览(209)

我是新接触MongoDB的,我在一个集合上创建了一个VIEW,我需要修改这个VIEW。假设我们有一个集合CollectionName,它有一个数组字段aArray,这个数组有两个字段,arrayField1arrayField2。目前正在从aArray中选择字段,如下所示:

$replaceRoot :
{
  newRoot: {
    $mergeObjects: [
      {
        arrayFieldNew1: '$aArray.arrayField1',
        arrayFieldNew1: '$aArray.arrayField2'
      }
    ]
  }
}

现在集合中增加了一个新的数组bArraybArrayaArray相同,bArray的字段名和aArray相同,分别是arrayField1arrayField2,我需要从aArray中选择arrayField1arrayField2。仅当bArray不存在时。如果bArray存在,则从bArray中选择arrayField1arrayField2
我希望我能传达我的要求。
我试着用谷歌搜索这个问题,但没有得到任何解决方案。

vlju58qv

vlju58qv1#

这可以通过为每个字段使用$cond和$type来实现,例如:

arrayFieldNew1: {$cond:{
                   if: {$eq:[{$type:"$bArray"},'missing']},
                   then: '$aArray.arrayField1',
                   else: '$bArray.arrayField1'
        }}
yfwxisqw

yfwxisqw2#

你可以使用条件来解决这个问题,一个合适的例子是$ifNull
参见https://runkit.com/embed/jatnkig9hbye上的演示

db.collection.insertMany([
  {
    aArray: {
      arrayField1: "A"
    },
    bArray: {
      arrayField2: "B"
    }
  }
])

const res = db.collection.aggregate([
  {
    "$project": {
      "arrayField1": {
        "$ifNull": [
          "$bArray.arrayField1", // check bArray first
          "$aArray.arrayField1"
        ]
      }
    }
  }
])

console.log(res) // [{"arrayField1": "A"}]

相关问题