我有一个文件可以有一个“收藏夹”元素,我正在尝试将一个新值推送到该元素的数组中。但是,我收到一个错误,因为我正在尝试更新的文档没有“收藏夹”元素。如果元素不存在,我如何创建元素,以便将新值推入其数组属性?我可以在一次手术中完成吗?这是我正在做的,但我收到错误cannot use the part (Favorites of Favorites.ProgramIds) to traverse the element ({Favorites: null})
var filter = Builders<UserEntity>.Filter.Eq(u => u.Id, userId);
var update = isFavorite ? Builders<UserEntity>.Update.AddToSet(u => u.Favorites.ProgramIds, id)
: Builders<UserEntity>.Update.Pull(u => u.Favorites.ProgramIds, id);
await collection.UpdateOneAsync(filter, update);
答案 0 :(得分:0)
如果要忽略重复项,可以使用$addToSet,它将创建或追加到数组中,将其视为一组。如果您只是想让它成为普通屁股普通数组,那么请使用$push。如果您明确使用$ push并获得错误,那么您就不应该这样做,这是一个单独的问题;请参阅官方文档:&#34;如果要更新的文档中缺少该字段,$ push会添加数组字段,并将值作为其元素。&#34;
答案 1 :(得分:0)
如果Favorities数组可能为null,则必须在使用“ addToSet”或“ push”之前创建该数组,否则会出现错误:
MongoDB.Driver.MongoWriteException:'写操作导致错误。 无法将$ addToSet应用于非数组字段。名为“收藏夹”的字段的非数组类型为null'
在下面的示例中,如果数组为null,则设置一个新数组
var filter = Builders<UserEntity>.Filter.Eq(u => u.Id, userId);
if (!isTheFavoritesArrayNotNull)
{
await collection.UpdateOneAsync(filter,
isFavorite ? Builders<UserEntity>.Update.Set(u => u.Favorites, new List<Favorite>()));
}
await collection.UpdateOneAsync(filter,
Builders<UserEntity>.Update.AddToSet(u => u.Favorites.ProgramIds, id));