$push 在 MongoDb 中不起作用?

Posted

技术标签:

【中文标题】$push 在 MongoDb 中不起作用?【英文标题】:$push in MongoDb not working? 【发布时间】:2016-02-26 13:43:22 【问题描述】:

我的架构如下所示:

    var exampleSchema = newSchema(
    profile:
    experience :[
              exp : String
    ]
   
  ); 

这是更新个人资料收集经验的代码:

exampleSchema.statics.experience = function (id,experience, callback)
var update = 
        $push: 
          'profile.experience': experience
        
      
      this.findByIdAndUpdate(id,update,function(err) 
        if (err) 
          callback(err);
         else 
          callback(null);
        
      )

我收到了类似The field 'profile.experience' must be an array but is of type String in document _id: ObjectId('5653f1d852cf7b4c0bfeb54a')[object Object]的错误

console.log(experience) 等于

 exp: 'jlkjlkjlk' 

我的收藏应该是这样的:

experience:[
   
    exp : "YYYY"
    ,
   
    exp:"xxxx"
 ]

【问题讨论】:

您正在尝试更新不是数组的字段“profile.experience.**exp**”。您必须将 $push 应用于“profile.experience”。 很抱歉我遇到了同样的错误 您的架构定义不明确。经验定义为experience :[ exp : String ],应为experience :[ exp : String **]** 谢谢,但在我的示例中,它的定义是正确的...... 你能确定所有插入'profile.experience'的记录都是数组吗?您似乎在文档中有一个字符串 _id: ObjectId('5653f1d852cf7b4c0bfeb54a') 【参考方案1】:

您可以使用$set 而不是$push,这可能会起作用。

$set: 
    'profile.experience': experience

【讨论】:

是的,它只有在我们已经有经验数组的情况下才会起作用,如果同时发生更新经验会发生什么,那么它将有无效的数据......它是最好分开执行推拉...【参考方案2】:

首先,您必须检查您将字段声明为这样的数组(查看字段产品):

   shop = 
        'name': "Apple Store",
        'description': "",
        'direction': "",
        'contact': "",
        'products':[]
    

现在,如果您想使用 $push 向字段产品添加一些内容

product = 
        'name': "Iphone 6",
        'description': "Iphone model 6, 64GB",
        'price': 700,
        'count': 3 
    
 myquery =  "name" : "Apple Store" 
 obj ="$push":"products":"$each": [product]
 db.collection.update_one(myquery,obj)

此代码是为 PyMongo 框架提供的。要在 MongoDB 中使用,直接用 update 替换 update_one。 Mongo resource

【讨论】:

【参考方案3】:

您是否正在搜索将多个值添加到单个字段中,然后使用这个。 把这个写成你的模型或架构:

    arrayremarks:[remark: String]

然后在你的控制器中写入:

module.exports.addingremarks = (req, res) => 
    let casenum=JSON.parse(JSON.stringify(req.body.casenum).replace(/"\s+|\s+"/g,'"'))
    var rem=remark:"Suman macha"
    Inwart.update(  'casenum': casenum , $push:  arrayremarks:rem  ,function (err, inwarts) 
        if (err)
         return console.error(err); 
         res.send(inwarts);  
     
  )

【讨论】:

【参考方案4】:

我改变了这样的架构

 experience          : [type:String,exp:String],

我的更新对象是这样的

 var update = 
    $push: 
      'profile.experience': san.exp

;

san 看起来像这样: exp: 'YYY'

在 mongoose 集合里面看起来像这样使用 RoboMongo

 "experience" : [ 
        "experienced in XXX", 
        "YYY"
    ],

【讨论】:

【参考方案5】:

想象一下你有这个收藏:

/* 1 */

    "_id" : ObjectId("565425e862760dfe14339ba8"),
    "profile" : 
        "experience" : [ 
            
                "exp" : "Experto"
            
        ]
    


/* 2 */

    "_id" : ObjectId("565425f562760dfe14339ba9"),
    "profile" : 
        "experience" : 
            "exp" : "Experto"
        
    


/* 3 */

    "_id" : ObjectId("5654260662760dfe14339baa"),
    "profile" : 
        "experience" : "Experto"
    

如果你尝试(更新文档 /* 2 */):

db.profile.update(
    _id: ObjectId("565425f562760dfe14339ba9") ,
    $push:  "profile.experience" :  exp : "Intermediate"   
)

你得到这个错误:

字段“profile.experience”必须是数组,但类型为 Object 在文档中 _id: ObjectId('565425f562760dfe14339ba9')

如果你尝试(更新文档 /* 3 */):

db.profile.update(
    _id: ObjectId("5654260662760dfe14339baa") ,
    $push:  "profile.experience" :  exp : "Intermediate"   
)

你会得到:

字段“profile.experience”必须是数组,但类型为字符串 在文档中 _id: ObjectId('5654260662760dfe14339baa')

【讨论】:

解决方案?【参考方案6】:
$push: 
    'profile.experience': experience

删除.exp

【讨论】:

我收到此错误:“profile.experience”字段必须是一个数组,但在文档中属于字符串类型

以上是关于$push 在 MongoDb 中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

Array .push 在 Promise 函数中不起作用

props.history.push() 在 metronic 主题中不起作用

Pop 和 Push 的导航在 SwiftUI 中不起作用?

@font-face 在 Firefox 中不起作用 [重复]

ReactJS Array.push 函数在 setState 中不起作用

重复本地通知在 react-native-push-notification 中不起作用