UpdateOne无法处理mongoDB中的对象数组

UpdateOne无法处理mongoDB中的对象数组,mongodb,mongoose,aggregation-framework,Mongodb,Mongoose,Aggregation Framework,我尝试在mongoDB中更新数组的对象。如果没有定义变量listID,它只会更新数组的第一个对象(但这不是我想要的) 我的目标是添加单词ID,更新最后一个字段,并通过单词ID的数量增加单词计数字段的数量 我也尝试过聚合,但无法使其工作 我的当前查询 Words.prototype.updatePersonalWordLists = async function(userID, listData) { const listID = listData.list_id const w

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

我的目标是添加单词ID,更新最后一个字段,并通过单词ID的数量增加单词计数字段的数量

我也尝试过聚合,但无法使其工作

我的当前查询

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的评论,我才得以成功

我从过滤器部分删除了
$
,并在´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´部分之外使用了´´´´´´´

  • 仅当单词ID是唯一的时,才会推送它们
  • 最后一次练习的日期可以更新
  • 字数也会增加

试着在过滤器部分省去
$
,比如
列表.list\u id:listID
非常感谢,它成功了!你能解释一下为什么会这样吗?不应该是“lists.list_id”未定义吗?MongoDB查询语言允许您使用该符号直接引用数组中对象中的键。更新中使用了
$
操作符来指示满足筛选条件的数组对象,因此
$
在查询部分没有特殊意义。好了,明白了!非常感谢。
    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