【问题标题】:update the mongodb embedded document with $elemMatch使用 $elemMatch 更新 mongodb 嵌入文档
【发布时间】:2013-09-18 19:59:46
【问题描述】:

我有一个包含嵌入式文档数组的模型。

var CourseSchema = mongoose.Schema({
         invitations: [InvitationSchema],
         total:Number
});

var InvitationSchema = new mongoose.Schema({
    token: { type:String, required: true},
    email: String
});

想通过匹配请求中邀请嵌入数组的令牌来更新/增加邀请总数,这里我按照http://diogogmt.wordpress.com/2012/03/23/update-elementmatch-and-the-positional-operator-on-mongodbmongoose/中的教程进行操作

所以我尝试了

var options = { new: false , select:'_id'};
CourseModel.update({'_id':id,'invitations':{'$elemMatch':{'token':token}}},{'$inc':{'total':1}},options,function(err,data) { 
    if(err){callback(err, null);}
    else{
        callback(null, data);
    }      
})

但它不起作用,如果我删除 'invitations':{'$elemMatch':{'token':token}},查询将起作用

【问题讨论】:

  • 我试过时效果很好。什么对你正在尝试的东西不起作用?
  • 我在 mongo shell 上试​​过,也可以。我猜猫鼬由于某种原因不起作用。我正在检查现在是什么问题

标签: mongodb mongoose


【解决方案1】:

根据documentation $elemMatch 只能用于投影。但是我发现了一个example,它说明了$elemMatch 与$all 的结合使用。试试这个。

1) 我通过以下方式在集合中创建了一个文档:

db.testColl.insert({count:0,arr:[{token:'xya'},{token:'xyb'},{token:'xyc'},{token:'xyd'},{token:'xye'}]})

2) 然后我使用不带

的查找命令
db.testColl.find()

输出:

{ "_id" : ObjectId("52345478ef5f122b1c9c54be"), "count" : 0, "arr" : [  {   "token" : "xya" },  {   "token" : "xyb" },  {   "token" : "xyc" },  {   "token" : "xyd" },  {   "token" : "xye" } ] }

3) 然后我依次运行以下命令:

db.testColl.update({arr:{$elemMatch:{token:'xya'}}},{'$inc':{'count':1}})
db.testColl.update({arr:{$elemMatch:{token:'xyb'}}},{'$inc':{'count':1}})
db.testColl.update({arr:{$elemMatch:{token:'xyc'}}},{'$inc':{'count':1}})
db.testColl.update({arr:{$elemMatch:{token:'xyd'}}},{'$inc':{'count':1}})
db.testColl.update({arr:{$elemMatch:{token:'xye'}}},{'$inc':{'count':1}})

4) 现在,db.testColl.find() 为我提供了所需的正确输出:

{ "_id" : ObjectId("52345478ef5f122b1c9c54be"), "count" : 5, "arr" : [  {   "token" : "xya" },  {   "token" : "xyb" },  {   "token" : "xyc" },  {   "token" : "xyd" },  {   "token" : "xye" } ] }

所以,您的查询似乎没问题!!!

【讨论】:

  • docs.mongodb.org/manual/reference/operator/elemMatch/…如果看到这个,$elementMatch也可以用来查询
  • 是的,您说得对,也可以用于查询。但是,如果它与数组邀请中的任何令牌匹配,它会返回整个文档吗?和你想要的一样吗?你能举个例子吗?问题本身的输出应该是什么?
  • InvitationSchema中有两个元素,分别是token和email,所以当然应该发出很多邀请,当客户端接受邀请时,将token提供给web、数据库将检查此令牌是否在邀请列表中。如果它在列表之一中,它将增加接受客户的总数 - 即 CourseSchema 中的“总”元素。我想要的只是在满足匹配时更新文档,而不需要返回文档。
  • 谢谢,阿努杰。我还使用了 mongo shell 对其进行了测试。查询有效,但奇怪的是猫鼬不能处理它。可能是mongoose版本不对,我现在去看看
  • 感谢@user824624,确认。是的,可能是版本问题。顺便说一句,我已经在 mongo 2.4.6 上检查过了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多