UpdateOne无法处理mongoDB中的对象数组
我尝试在mongoDB中更新数组的对象。如果没有定义变量listID,它只会更新数组的第一个对象(但这不是我想要的) 我的目标是添加单词ID,更新最后一个字段,并通过单词ID的数量增加单词计数字段的数量 我也尝试过聚合,但无法使其工作 我的当前查询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
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