【问题标题】:Mongoose: MongoError: >1 field while trying to project out $elemMatchMongoose:MongoError:>1 字段,同时尝试投影 $elemMatch
【发布时间】:2020-08-14 01:08:00
【问题描述】:

我正在尝试仅在更新版本中投影出匹配的数组元素。但我收到错误消息:“MongoError: >1 field in obj: { _id: 0, lotes.$: 1 }”

如果我删除“new: true”,它会起作用。但后来我有更新前的文档。我真的很想要更新的版本。

怎么了?我该如何解决?

Offer 文档类似于:

 {
      _id
      series: [ Serie ]
    }

系列结构类似于:

{
  _id
  public.available: Number
  public.expDate: Date
}

我正在使用猫鼬:

        var query = {
            '_id': offerId, 
            'series': { 
                $elemMatch: {
                    '_id': serieId,
                    'public.available': {$gt:0},
                    'public.expDate': {$gt: now}
                }
            }
        };
        var update = { 
            $inc: { 'series.$.public.available' : -1 }
        };
        var options = { // project out just the element found, updated
            new:true,
            select: {
              '_id': 0,
              'series.$': 1 
            }
        };

        Offers.findOneAndUpdate(query, update, options)
        .then( element => {
             ...
        }

【问题讨论】:

  • 尝试使用$elemMatch 投影... select: { '_id': 0, 'series': { $elemMatch: { 'public.available': { $gt :0 }, 'public.expDate': { $gt: now } } } }
  • 我刚试过安东尼。我收到错误“MongoError: >1 field in obj: { _id: 0, series: { $elemMatch: { public.available: { $gt: 0 }, public.expDate: { $gt: new Date(1534944191392) } } } }"
  • 我在任何地方都找不到这个错误的解释..

标签: mongodb mongoose


【解决方案1】:

对于遇到此错误的其他人来说,这也是尝试执行非法操作(例如尝试更新 findOne 请求中的数据库元素)时最常见的错误。

确保您的请求是正确的,例如 findOneAndUpdate 应该是您收到此错误时的第一个调用端口。

【讨论】:

    【解决方案2】:

    正如 Anthony Winzlet 在链接中指出的那样,Mongoose 似乎存在问题,如果您使用 'new:true',则无法投射 $elemMatch。

    所以我的解决方案是仅继续使用“new:true”,不进行预测。稍后减少数组以获得 $elemMatch:

    .then( (result) => {
      var aux = result.series.reduce((acu, serie, index) => {
        if (serie._id == req.params.serieId) return index;
      });
      var element = result.series[aux];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-26
      • 2016-10-09
      • 1970-01-01
      • 2014-07-04
      • 1970-01-01
      • 2015-04-01
      • 2014-10-21
      • 1970-01-01
      相关资源
      最近更新 更多