使用MongoDB C#驱动程序2.0添加元素或添加到数组
我有一个文档,上面可以有一个“Favorites”元素,我正试图将一个新值推送到该元素的数组中。但是,我得到了一个错误,因为我试图更新的文档没有“Favorites”元素。如果元素不存在,如何创建它,以便将新值推送到它的数组属性中?我能一次做完吗?下面是我正在做的,但是我得到了一个错误使用MongoDB C#驱动程序2.0添加元素或添加到数组,c#,arrays,mongodb,mongodb-.net-driver,mongodb-csharp-2.0,C#,Arrays,Mongodb,Mongodb .net Driver,Mongodb Csharp 2.0,我有一个文档,上面可以有一个“Favorites”元素,我正试图将一个新值推送到该元素的数组中。但是,我得到了一个错误,因为我试图更新的文档没有“Favorites”元素。如果元素不存在,如何创建它,以便将新值推送到它的数组属性中?我能一次做完吗?下面是我正在做的,但是我得到了一个错误无法使用部分(Favorites.ProgramIds的收藏夹)遍历元素({Favorites:null}) var-filter=Builders.filter.Eq(u=>u.Id,userId); var u
无法使用部分(Favorites.ProgramIds的收藏夹)遍历元素({Favorites:null})
var-filter=Builders.filter.Eq(u=>u.Id,userId);
var update=isFavorite?Builders.Update.AddToSet(u=>u.Favorites.ProgramIds,id)
:Builders.Update.Pull(u=>u.Favorites.ProgramIds,id);
wait collection.UpdateOneAsync(过滤器,更新);
如果希望忽略重复项,可以使用,它将创建或追加到数组中,并将其视为一个集合。如果您只希望它是一个普通数组,那么使用。如果显式使用$push并出现错误,则不应该这样做,这是另一个问题;请参阅官方文档:“如果要更新的文档中缺少字段,$push将添加数组字段,该字段的值作为其元素。”如果希望忽略重复项,可以使用,它将创建或追加到数组中,并将其视为一个集合。如果您只希望它是一个普通数组,那么使用。如果显式使用$push并出现错误,则不应该这样做,这是另一个问题;请参阅官方文档:“如果要更新的文档中没有该字段,$push将添加数组字段,该字段的值作为其元素。”如果偏好数组可能为空,则必须在使用“addToSet”或“push”之前创建数组,否则会出现错误:
MongoDB.Driver.MongoWriteException:'写入操作导致错误。
无法将$addToSet应用于非数组字段。名为“收藏夹”的字段具有非数组类型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));
var-filter=Builders.filter.Eq(u=>u.Id,userId);
如果(!isTheFavoritesArrayNotNull)
{
等待集合。UpdateOneAsync(过滤器,
isFavorite?Builders.Update.Set(u=>u.Favorites,new List());
}
等待集合。UpdateOneAsync(过滤器,
Builders.Update.AddToSet(u=>u.Favorites.ProgramIds,id));
如果偏好数组可能为空,则必须在使用“addToSet”或“push”之前创建数组,否则会出现错误:
MongoDB.Driver.MongoWriteException:'写入操作导致错误。
无法将$addToSet应用于非数组字段。名为“收藏夹”的字段具有非数组类型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));
var-filter=Builders.filter.Eq(u=>u.Id,userId);
如果(!isTheFavoritesArrayNotNull)
{
等待集合。UpdateOneAsync(过滤器,
isFavorite?Builders.Update.Set(u=>u.Favorites,new List());
}
等待集合。UpdateOneAsync(过滤器,
Builders.Update.AddToSet(u=>u.Favorites.ProgramIds,id));
如果数组元素不存在,这两种方法仍然会导致错误。我的问题是,如果数组不存在,如何插入数组本身,然后将值插入该数组;您的问题(现在我可以看到您的编辑)看起来是因为您试图在字段存在之前基于字段进行遍历。好的,这是有意义的,但我仍然不知道如何编写它以使其工作。对我来说,这听起来是另一个问题。如果数组元素不存在,这两种方法仍然会导致错误。我的问题是,如果数组不存在,如何插入数组本身,然后将值插入该数组;您的问题(现在我可以看到您的编辑)看起来是因为您试图在字段存在之前基于字段进行遍历。好的,这是有意义的,但我仍然不知道如何编写它以使其工作。对我来说,这听起来是另一个问题。如果数组元素不存在,这两种方法仍然会导致错误。我的问题是,如果数组不存在,如何插入数组本身,然后将值插入该数组;您的问题(现在我可以看到您的编辑)看起来是因为您试图在字段存在之前基于字段进行遍历。好的,这是有道理的,但我仍然不知道如何编写它以使其工作。对我来说,这听起来是另一个问题。