2

我在 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}]
}

好的。如果用户想购买例如 5 件商品{_id: 3}(我们不知道用户是否有字段),我将如何使用 Users.update( company_id: 3)

我想它可能是这样的:

Companies.update({_id: 3}, {$inc: {item_amount: - 5}})
&&
Users.update({userId: _id}, {$set: {'ownedItems[x].company_id': 3}, $inc{'ownedItems[x].item_amount': 5})

但是,原因有一些问题。
我怎么知道[x]每个 clint 的值?解决?如果我需要添加新公司怎么办?如果字段不存在会起作用
吗?$set'ownedItems[x].company_id'

也许我可以在 IF/Else 语句中检查 smth。例如,使用$exist, 或$cond( 用于聚合) 选择器。但是 .find() 总是返回一个游标(是吗?),而不是 true 或 false。那么可以做什么呢?如何使用聚合选择器?像这样:

Users.find({_id: userId}, {$cond: [{$eq: ['owenedItem[x].company_id', _someId_]}, {$set:{...}}, {$push: {...}}]})

它会起作用吗?

4

1 回答 1

3

听起来您想将 $elemMatch 运算符与 '$' 位置运算符一起使用:

http://docs.mongodb.org/manual/reference/operator/elemMatch/ http://docs.mongodb.org/manual/reference/operator/positional/

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

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

$elemMatch运算符明确您正在查询列表的哪些元素。然后,您可以在修饰符子句中使用$运算符来引用该匹配元素并对其进行更改。

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

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

http://docs.mongodb.org/manual/reference/operator/addToSet/

于 2013-01-31T20:13:39.083 回答