查询时展开对象ID

时间:2016-09-07 17:53:22

标签: node.js mongodb mongoose

我有一些对象,我想根据嵌套对象的数据进行过滤。想象一下,我有一个像这样的对象:

{
  "_id": ObjectId("57caf0aa229e53a68b2d2ac3"),
  "name": "John",
  "surname": "Lennon",
  "contact": ObjectId("57caee695f4f1ba38b7badd3"),
  "__v": 0
}

我的目标是使用拨号代码+44检索用户。我试着像

一样查询
User.find({"contact.dial_code":"+44"})

然而它返回0个文件(并且应该有一些文件)。我该如何进行此查询?

2 个答案:

答案 0 :(得分:1)

好的,所以你可以使用对其他集合的引用来实现这条路线,这会产生更小的文档,这些文档可能更容易阅读,但是你的表现可能会受到影响。

嵌入文档通常更好......例如:

Contact.findOne({dial_code: "+44"}, function(err, contacts) {
  // if no error and contacts.length > 0
  User.find({contact: "contacts._id"}, function(err, users) {
    // users is the array of users with dial_code "+44"
  });
});

现在您的查询只会从一个集合中删除。

如果你坚持使用引用,你将不得不做两个查询并通过MongoDB Driver / Mongoose将结果传递给回调函数,或者使用聚合框架。

猫鼬看电话可能看起来像......

n = numpy.zeros((3,3))
s = numpy.zeros((3,3))
w = numpy.zeros((3,3))
e = numpy.zeros((3,3))

n[0][1] = 1
s[2][1] = 1
w[1][0] = 1
e[1][2] = 1

img_n = cv2.erode(img, n, iterations=1)
img_s = cv2.erode(img, s, iterations=1)
img_w = cv2.erode(img, w, iterations=1)
img_e = cv2.erode(img, e, iterations=1)

result = img_n + img_s + img_w + img_e + img

答案 1 :(得分:0)

在这种情况下,您可以使用$ lookup(Official documentation)阶段的聚合管道来连接两个集合

注意:它需要MongoDB 3.2