mongoDB子文档匹配elemMatch不是对象

时间:2017-04-18 10:00:46

标签: node.js mongoose

我有一个子文档,其架构如下所示

{
    things: [ { thing: { type: String }, otherThing: { type: String } ]
}

让我们假装它像这样填充

[
    { thing: 'Thing 1', otherThing: '123-001'},
    { thing: 'Thing 2', otherThing: '123-002'},
    { thing: 'Thing 3', otherThing: '123-003'},
    { thing: 'Thing 4', otherThing: '123-004'}
]

我想现在插入到这个Thing 5中,但我想先检查它是否存在,所以我这样做:

Things.findOneAndUpdate(
{ 
  things: {
    $elemMatch: {
      thing: {
        $ne: 'Thing 5'
      }
    }
  }
}, 
{ 
  $push: { 
    things : { 
      thing: 'Thing 5', 
      otherThing: '123-005'
    }
  }
})

第一次运行脚本时,会插入Thing 5。当我第二次运行它时,我预计它会失败,但它会插入一个副本" Thing 5"。

我怀疑这是因为$ elemMatch thing $ ne匹配Thing 1 - 4因此会推动。我需要做什么,它基本上说"如果事情5不在这些子文档中的任何一个"?

1 个答案:

答案 0 :(得分:0)

正如@Veeram指出的那样,使用dot notaion代替它并且它可以工作。

此代码适用于mongo:

db.col.update({ "things.thing":{$ne:"Thing 5"} }, {$push:{things:{'thing': 'Thing 5', 'otherThing': '123-005'}}})

点符号的有用链接:

https://docs.mongodb.com/manual/core/document/#dot-notation

希望有所帮助