MongoDB:在数字或字符串数​​组上使用$ elemMatch

时间:2014-07-28 08:34:31

标签: mongodb mongoose

我正在为我的应用中的商品(产品)制作用户评级(竖起大拇指/竖起大拇指)。

我似乎能够通过一组对象实现我想要的东西,但我想知道mongodb是否提供了一种使用数字数组(user_ids)来实现此目的的方法。

db.items.insert({up: 2, down: 3, u_up: [{id: 1}, {id:2}], u_down: [3,4,5]})
db.items.insert({up: 3, down: 3, u_up: [{id: 1}, {id:2}, {id:3}], u_down: [7,8,9]})
db.items.insert({up: 0, down: 0, u_up: [], u_down: []})
db.items.insert({up: 2, down: 2, u_up: [{id:2},{id:3}], u_down: [7,9]})

为了帮助解释我想要做的事情,我已经将u_up(点击了大拇指的用户)实现为一个对象数组,将u_down(已经点击的用户)实现为一组数字。上下字段是该特定产品的上下投票总数。

仅查看u_up,如果我运行以下查询,

db.items.find({}, {up: 1, u_up: {$elemMatch: {id: 2}}})

让我回到我想要的东西..用户2的所有四个项目,但只有在该用户投票时才填充u_up。所以,我知道他已经对这个特定的项目进行了投票,同时还找回了他没有投票的所有项目。我不想知道查询结果中的其他用户。

 {"_id": 2345,"up": 2,
   "u_up": [{"id": 2}]}

 {"_id": 4432,
   "up": 3,
   "u_up": [{"id": 2}]}

 {"_id": 2345,
   "up": 0}

 { "_id": 2345,
   "up": 2,
   "u_up": [{"id": 2}]}

为每个用户存储整个对象似乎有点浪费,我希望改为使用数组(就像我上面为u_down实现的那样)。

mongodb中是否有查询可以实现此目的?或者另外一个会返回一个标志或者某个东西来表示用户已经投票或者已经投票,但也要返回他没有投票的产品?

感谢。

1 个答案:

答案 0 :(得分:5)

看来这就是诀窍......

db.items.find({}, {down: 1, u_down : {$elemMatch: {$in: [9]}}})

给予

 {"_id": 23123,
   "down": 3}

 {"_id": 34123,
   "down": 3,
   "u_down": [9]}

 {"_id": 23412,
   "down": 0}

 {"_id": 12332,
   "down": 2,
   "u_down": [9]}

如果有人知道我如何将u_down转换为带有mongo的true标志,如下所示。我很想知道。

 {"_id": 23412,
   "down": 0}

 {"_id": 12332,
   "down": 2,
   "u_down": true}