2014-09-21 59 views
1

更新的开头插入元素: 这里的问题是,本地的MongoDB驱动程序所需要的的objectID比猫鼬不同的格式。我需要做{_id:new mongoose.Types.ObjectId(story_id)},而不是{_id:story_id}。它仅返回两个字段的原因是它使用{_id:story_id}创建了一个新文档,而不是更新{_id:{$ oid:story_id}}文档。然而,我原来的原因与原生驱动程序与猫鼬做到这一点,结果不起作用。即使是本地驱动程序也不接受正的$ slice值。所以我仍然在寻找一种方法来使用Mongoose或通过Mongoose访问的本地驱动程序(不支持$ position或$ slice正值)插入一个数组的开头。findAndModify的MongoDB在阵列

当我运行下面的查询,返回的结果只包含_id,消息和参与者。我希望获得完整的故事记录,而不仅仅是更新后的字段。有没有办法做到这一点?根据Node MongoDB Native驱动程序文档(http://mongodb.github.io/node-mongodb-native/api-generated/collection.html#findandmodify),mongo控制台中的“fields”参数未在findAndModify驱动程序中实现。我想避免必须做第二次查询才能获得刚刚更新的记录。

Story.collection.findAndModify(
{"_id": story_id}, 
{"_id": "asc"}, 
{ 
    "$push": { 
"messages": { 
    "$each": [message], 
    "$sort": { "_id": -1}, 
    "$slice": 500 
    }, 
    }, 
    "$addToSet": {"participants": user_id}, 
}, 
    {new: true}, 
    {fields: {"feeling":1, "description":1, "image_height":1, "image_width":1, "storyteller":1, "image_url":1, "participants":1}}, // -> this line is ignored by MongoDB native driver 

     {upsert: true} 

) 
+0

你是不是在调用['Story.findByIdAndUpdate'](http://mongoosejs.com/docs/api.html#model_Model.findByIdAndUpdate)?无论如何,你应该得到整个文档,而不仅仅是更新的领域。 – JohnnyHK 2014-09-21 13:28:15

+0

猫鼬findByIdAndUpdate没有支持用于添加到阵列的开始,就像我跟$排序和$片在这里做(猫鼬看起来负$切片的值和如下所示不会返回整个返回一个错误。这个查询DOC回 – 2014-09-21 22:58:27

回答

2

可以插入在阵列字段开头的元素与使用$each$position修饰符(这是由猫鼬支持)一个$push:如果您使用猫鼬,为什么

Story.findByIdAndUpdate(story_id, { 
    $push: { 
     messages: { 
     $each: [message], 
     $position: 0 
     }, 
    }, 
    $addToSet: {participants: user_id}, 
    }, { 
    new: true, 
    upsert: true 
    }, 
    function (err, newDoc) { ... } 
); 
+2

猫鼬不支持通过$位置参数。见:https://github.com/LearnBoost/mongoose/issues/2024这里最后回复” http://stackoverflow.com/questions/23083041/如何插入到特定位置在数组在sub -ocument-by-using-m从猫鼬错误是$ $每个只能与$ sort或$切片配对 – 2014-09-22 00:57:20

+0

@PraneethWanigasekera该错误被标记为[3.8.12中修复](https://github.com/LearnBoost/mongoose/commit/6cddf8441dad0d6fb9c4588d4cb05b7d71d44b90),并且当我用Mongoose 3.8.16测试它时它工作正常。 – JohnnyHK 2014-09-22 01:04:02

+0

它会很棒如果它工作的话,我也使用3.8.16,这里是错误我得到与上面的代码:{[OperationalError:异常:$每个术语只需要$切片(和任选$排序)作为补] 名:“OperationalError”, 消息:异常:$每个术语只需要$切片(和可选$排序)为补, 原因: {[MongoError:异常:$每学期只需要$片(和可选$排序)作为补充]非常感谢您的帮助。 – 2014-09-22 01:46:49