仅当其他字段与MongoDB中的值匹配时,如何更新数组中的字段

仅当其他字段与MongoDB中的值匹配时,如何更新数组中的字段,mongodb,updates,Mongodb,Updates,我有点纠结于MongoDb的查询和更新选择器 情境:我们有公司收藏。像这样吗 Companies.find({}) => {_id: 1, item_amount: 5}, {_id: 2, item_amount: 7}, {_id: 3, item_amount: 10} 我们有一些结构的用户集合。用户想要购买任何物品,这可能会降低公司价值,增加用户数量,但有一个条件——用户可能知道他在哪里购买物品 {userId: _id, ownedItems: [{compa

我有点纠结于MongoDb的查询和更新选择器

情境:我们有公司收藏。像这样吗

Companies.find({}) =>
 {_id: 1, item_amount: 5}, 
 {_id: 2, item_amount: 7}, 
 {_id: 3, item_amount: 10}
我们有一些结构的用户集合。用户想要购买任何物品,这可能会降低公司价值,增加用户数量,但有一个条件——用户可能知道他在哪里购买物品

{userId: _id,
 ownedItems: 
  [{company_id: 2, item_amount: 3},
  {company_id: 1, item_amount: 5}]
}
嗯。例如,如果用户想从
{u id:3}
购买5件物品,我可以如何更新Users.update()(我们不知道用户是否有
公司id:3
的字段)

我想可能是这样的:

Companies.update({u id:3},{$inc:{item\u amount:-5}})

&&
Users.update({userId:{u id},{$set:{'ownedItems[x]。公司id:'3},$inc{'ownedItems[x]。项目金额:'5})

但当然也有一些问题。
我如何知道每个客户的
[x]
?对其进行排序?如果我需要添加新公司怎么办?
如果字段
'ownedItems[x].公司id'
不存在,
$set
是否有效

可能是我可以在IF/Else语句中检查smth。例如,使用
$exist
$cond
(用于聚合)选择器。但是.find()始终返回一个游标(是吗?),不是真的还是假的。那么可以做什么呢?我如何使用聚合选择器?如下:

Users.find({u-id:userId},{$cond:[{$eq:['owenedItem[x].company\u-id',{u-someId},{$set:{…},{$push:{…}]})


它会工作吗?

听起来您想将$elemMatch运算符与“$”位置运算符结合使用:

让我们以您的示例为例。假设您希望在用户的“ownedItems”列表中找到“company_id”为3的元素,并将该元素的“item_amount”更新5。这可以在一个更新语句中完成,如下所示:

Users.update( { userId: _id, ownedItems : { $elemMatch : { company_id : 3 } } },
              { $inc : { ownedItems.$.item_amount : 5 } } )
$elemMatch运算符使其明确显示您要查询的列表中的哪些元素。然后,您可以在MODIFER子句中使用$运算符引用该匹配元素并对其进行更改

如果用户的“ownedItems”列表没有任何与{“company_id”:3}匹配的条目,则上述更新将不会执行任何操作。如果发生这种情况,您可以使用$addToSet操作符进行第二次更新,以添加新条目,如下所示:

Users.update( { userId: _id },
              { $addToSet : { ownedItems : { company_id : 3, item_amount : 5 } } } )

谢谢你的回答!但可能我遗漏了一些东西。我在这里看到了两个问题作为我的示例。首先,我不知道用户集合是否有
公司id
,所以如果用户文档中没有字段会发生什么。第二个“问题”,可能是我不熟悉$operator,但我认为它返回了查询的第一个匹配项s数组,因此在数组中,它可以增加值,例如company_id=1,如果它将是查询的第一个匹配项(很抱歉问这么愚蠢的问题:)?很好!在这种情况下,您必须进行两次更新。您可以检查我提到的原始更新的结果,如果它实际上没有更改任何内容(因为查询不匹配),然后执行另一个更新,使用$addToSet将新条目添加到ownedItems列表中。我将使用详细信息更新我的答案。我不确定我是否理解您的第二个问题。它是否会增加列表中的第一个匹配项?您是否希望列表中的多个条目具有相同的公司id?