我有一个orders
,每个都嵌入了transactions
。
{
_id: orderId1,
other_fields: something else,
transactions: [
{
_id: someId,
price: 25,
status: 1
},
{
_id: someId2,
price: 30,
status: 0
}
]
}
现在我想改变其中一个事务的状态(比方说:someId2)。我怎样才能做到这一点?
订单和交易都是交易为ICollection<Transaction>
此外,是否可以不使用任何魔术弦?
答案 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进行搜索,这应该适用于您的设置。