mongodb中的arrayFilters

时间:2018-07-13 12:13:55

标签: mongodb mongoose

我有以下架构。

{
   posts: [
          {
             _id: '5ayuunbdsyuuuyut778'
             replies: [{
                 _id: "67hfudj7e9whduu888",
                 text: "something"
             }]
          }
      ]
}

我想更新特别回复的文字。 我在用猫鼬。

我写的查询如下

Post.findOneAndUpdate(
   {'posts.replies._id': _id}, 
   {$set: {'posts.$[post].replies.$[reply].text': "something1"}},
   { arrayFilters: [{'post._id': postId}, { 'reply._id': _id }]}
 )

此查询不会更新文档。

我想念什么吗?我是否需要使用ObjectId投射ID

3 个答案:

答案 0 :(得分:1)

您需要使用new: true来获取更新后的值,并将id强制转换为mongoose objectId才能使其正常工作

Post.findOneAndUpdate(
   { 'posts.replies._id': _id }, 
   { $set: { 'posts.$[post].replies.$[reply].text': "something1" } },
   { arrayFilters: [{ 'post._id': postId }, { 'reply._id': _id }], new: true }
)

答案 1 :(得分:0)

由于arrayFilters与mongodb相关,因此您需要使用ObjectId在mongoose中强制转换id

Post.findOneAndUpdate(
   { 'posts.replies._id': _id }, 
   { $set: { 'posts.$[post].replies.$[reply].text': "something1" } },
   { arrayFilters: [{ 'post._id': postId }, { 'reply._id': _id }]}
)

必须更改为

Post.findOneAndUpdate(
   { 'posts.replies._id': _id }, 
   { $set: { 'posts.$[post].replies.$[reply].text': "something1" } },
   { arrayFilters: [{ 'post._id': ObjectId(postId) }, { 'reply._id': ObjectId(_id)}]}
)

答案 2 :(得分:0)

arrayFilters 不接受字符串化的对象 ID,与 mongoose 中的典型过滤器(自动为您投射对象 ID)相反,您必须在将其作为过滤器传递给 arrayFilters 时手动投射对象 ID。

Post.findOneAndUpdate(
   { 'posts.replies._id': _id }, 
   { $set: { 'posts.$[post].replies.$[reply].text': "something1" } },
   { arrayFilters: [{ 'post._id':new ObjectId(postId) }, { 'reply._id': new ObjectId(_id) }], new: true }

这行得通,查看评论here了解更多详情