UpdateOne 不适用于 mongoDB 中的对象数组

莫里斯

我尝试更新 mongoDB 中的数组对象。当变量 listID 未定义时,它只会更新数组的第一个对象(但这不是我想要的)。

我的目标是添加单词 ID,更新 last_practiced 字段并将单词计数字段的数量增加 wordID 的数量。

我也尝试过聚合,但我无法让它工作。

我当前的查询

Words.prototype.updatePersonalWordLists = async function(userID, listData) {

    const listID = listData.list_id
    const wordIDs = listData.word_ids
    const last_practiced = listData.last_practiced
    const numberOfNewWords = listData.word_ids.length
    
    const lists = await personalWordLists.updateOne(
        {"user_id": userID,  "lists.$.list_id": listID }, 
        {
        $addToSet: { "lists.$.practiced_words": { $each: wordIDs}}, 
        $set: { 
            "lists.$.last_practiced": last_practiced,
            $inc: {"lists.$.wordCount": numberOfNewWords}
            }
        }
    )

    return lists
}

let userID = "609b974f6bd8dc6019d2f304"
let listData = {
    list_id: "609d22188ea8aebac46f9dc3",
    last_practiced: "03-04-2021 13:25:10",
    word_ids: ["1", "2", "3", "4", "5"],
}

word.updatePersonalWordLists(userID, listData).then(res => console.log(res)) 

我的方案

const mongoose = require('mongoose');

const personalWordListsSchema = new mongoose.Schema({
  user_id: {
    type: String
  },
  lists: Array
});

module.exports = personalWordListsSchema

我希望有人能帮我解决这个问题。提前致谢。

莫里斯

感谢@joe 的评论,我能够让它发挥作用。

$从过滤器部分中删除了,并在 ´´´$set´´´ 部分之外使用了 ´´´$inc´´´。

  • 仅当单词 ID 是唯一的时才会推送它们。
  • 上次练习的日期可以更新。
  • 字数也会增加。
    const list = await personalWordLists.updateOne(
        {"user_id": userID,  "lists.list_id": listID }, 
        {
        $addToSet: { "lists.$.practiced_words": { $each: wordIDs}}, 
        $set: { 
            "lists.$.last_practiced": last_practiced
            },
        $inc: {"lists.$.wordCount": numberOfNewWords}
        }
    )

    return list

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章