Mongodb .net更新其中一个嵌入式文档

时间:2017-11-15 02:06:49

标签: c# mongodb mongodb-.net-driver

我有一个orders,每个都嵌入了transactions

{
    _id: orderId1,
    other_fields: something else,
    transactions: [
       {
           _id: someId,
           price: 25,
           status: 1
       },
       {
           _id: someId2,
           price: 30,
           status: 0
       }
    ]
}

现在我想改变其中一个事务的状态(比方说:someId2)。我怎样才能做到这一点?

订单和交易都是交易为ICollection<Transaction>

的模型

此外,是否可以不使用任何魔术弦?

2 个答案:

答案 0 :(得分:0)

可以使用以下查询

来完成
db.collection.update({"transactions._id":"someId2"}, {$set:{"transactions.$.status":2}})

查询的第一部分是查找记录,第二部分是更新文档,此更新是positional更新

请注意,仅对一个匹配的文档进行位置更新。即使我们有多个与查询匹配的文档,也只会更新一个文档,所以为了安全地使用位置更新,在查找查询部分时给出最大条件来检索唯一匹配文档,比如在这种情况下修改后的查询是

db.collection.update({"_id":"orderId1", "transactions._id":"someId2"}, {$set:{"transactions.$.status":1}})

答案 1 :(得分:0)

以下是使用C#驱动程序完成此操作的一种示例:

await mongoCollection.UpdateOneAsync(
    o => o.Id == orderId1 && x.Transactions.Any(t => t.Id == someId2),
    Builders<Order>.Update.Set(x => x.Transactions[-1].Status, someStatus));

使用-1作为索引器是所有这一切的关键 - 它本质上是从C#到Positional Operator的转换。这指示驱动程序使用我的示例中对x.Transactions.Any的调用中匹配的索引。我确定有其他方法可以使用Any,但鉴于您要使用唯一ID进行搜索,这应该适用于您的设置。